Problèmes de mise à jour SQL dans MS Access - Operation doit utiliser une requête pouvant être mise à jour
J'ai une requête select qui fait de la manipulation d'un texte essentiellement reformater un champ de sorte que je peux regarder dans une autre table:
Si ma première table si j'ai un champ comme "J1/2" il regarde l'ID d'un enregistrement dans une table différente avec J1 et J2 dans les champs appropriés.
Tout cela fonctionne bien.
Maintenant je veux mettre à jour la table d'origine donc je n'ai pas à faire des recherches à l'aide de cette manipulation de chaînes de plus, mais mes tentatives de requêtes de mise à jour à la fin avec "l'Opération doit utiliser une requête de mise à jour"
Des idées?
Mon instruction SELECT:
SELECT DISTINCT
t1.DD,
t1.TN,
t1.DD & " J" & MID(t1.TN,2,1) AS CalculatedStart,
t1.DD & " J" & MID(t1.TN,4,1) AS CalculatedEnd,
t2.ID
FROM t1 INNER JOIN t2
ON (t1.DD & " J" & MID(t1.TN,2,1)=t2.StartLink)
AND (t1.DD & " J" & MID(t1.TN,4,1)=t2.EndLink)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
Rappeler - ce qui fonctionne bien, et j'ai le nécessaire t2.ID de sortir à l'autre bout.
Donc je veux faire quelque chose comme:
UPDATE t1 SET t2ID = (
SELECT Query1.ID
FROM Query1
WHERE t1.DD=Query1.DD
AND t1.TN=Query1.TN
)
WHERE t1.TN Like "J?/?"
AND t1.DD Like "M*";
Seulement cela échoue. C'est dans MS Access lui-même donc je ne peux pas imaginer un réel problème d'autorisations comme la plupart de "l'Opération doit utiliser une requête de mise à jour" les problèmes semblent être.
EDIT: en Essayant de simplifier les cas qui ne fonctionne pas.
Cette requête de mise à JOUR est très bien:
UPDATE t1
SET t2ID="Unknown"
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
Ce un échec (Merci Goedke - cet exemple évidemment échoue parce que la sous-requête renvoie plus que 1 résultat. J'ai eu trop simpliste pour essayer de trouver mon problème)
UPDATE t1
SET t2ID=(SELECT ID FROM t2)
WHERE TN LIKE "J?/?"
AND DD LIKE "M*";
Moi aussi je viens d'avoir mes sous-requête syntaxe incorrecte, d'une certaine façon?
EDIT: Cette instruction SELECT est trop belle:
SELECT t1.OA, t1.DD, t1.TN, t1.HATRIS,
query1.DD, query1.TN, query1.ID
FROM t1 INNER JOIN query1
ON t1.DD=query1.DD
AND t1.TN=query1.TN
En outre, à l'aide de compter sur l'instruction select ci-dessus montre qu'il y a exactement 1 ID retourné par (DD,TN) combinaison
EDIT:
Le cas le plus simple, j'ai maintenant à l'aide de diverses instructions SELECT, j'ai un tableau à 2 colonnes de la clé primaire de t1 et de la valeur que je veux insérer dans t1.
Je n'ai pas encore semblent écrire
UPDATE t1 SET t1.f2 = (SELECT t2.f2 FROM t2 WHERE t2.f1 = t1.f1)
où t1 est la clé primaire est la f1. Même l'ajout d'OÙ t1.f1 IN (SELECT f1 à PARTIR de t2) n'aide pas. (Ajouté pour éliminer la possibilité que la sous-requête renvoie 0 résultats)
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Une sous-requête (SELECT ID from t2) ne peut pas fonctionner à moins qu'il n'existe qu'un seul enregistrement dans t2. Qui ID attendez-vous à être utilisé?
Le message d'erreur est signalée se produit normalement lorsque vous avez rejoint et ne sont pas compris toutes les clés primaires nécessaires à la mise à jour de tableaux de données sous forme liée (par exemple, votre origine DISTINCTES détruit information sur les touches, donc si elle était liée à un formulaire, le formulaire ne serait pas en mesure d'enregistrer en arrière).
Le fait que vous utilisez DISTINCTES, il me ferait suspect que la sous-requête retourne plusieurs lignes dans votre exemple plus complexe. C'est probablement le problème le plus commun avec l'attribution d'une sous-requête résultat: sous contraignante de la clause where.
Un autre problème que j'ai vu à l'attribution d'une sous-requête est de savoir si la syntaxe de l'intérieur de la requête est incorrecte. Au moins avec SQL 2000 et 2005 de la fin, le processeur de requêtes silencieusement échouer et retourner la valeur NULL dans de tels cas. (Ce qui est, autant que je peux dire, d'un bug: je ne vois pas pourquoi quelque chose qui va renvoyer une erreur au niveau supérieur serait silencieusement permis dans une sous-requête... mais il est là.)
EDIT:
Juste pour s'assurer que ni Paul ou je n'étais pas fou, j'ai créé les tableaux suivants:
Je n'ai pas mettre des contraintes à l'exception d'une clé primaire ID et ID2. Tous les champs texte, qui est différent de ce que j'utilise normalement pour les Id, mais il devrait être hors de propos.
t1:
t2:
Une requête de la forme:
A échoué avec le même message de Paul got.
fonctionne comme prévu, nous savons donc que la sous-requête de la syntaxe n'est pas à blâmer.
fonctionne également comme prévu, de sorte que nous n'avons pas la corruption ou à des non modifiable de destination.
Remarque: si je change la principale base de données de natif SQL 2005, la mise à jour fonctionne! Un peu de recherche sur google et j'ai trouver l'Accès Mvp suggérant DLOOKUP pour remplacer une sous-requête:
http://www.eggheadcafe.com/software/aspnet/31849054/update-with-subquerycomp.aspx
Apparemment c'est un bug dans l'Accès SQL, qui est évité lors de l'utilisation d'un SQL Express 2000 ou supérieur. (Les résultats de google pour "l'accès de mise à jour de la sous-requête" l'appui de cette théorie).
Cliquez ici pour voir comment utiliser cette solution de contournement: http://www.techonthenet.com/access/functions/domain/dlookup.php
Je dois peser avec David W. Fenton commentaire de l'OP.
C'est très ennuyeux problème avec Jet/ACE. Mais essayez:
l'arrière-plan de la fenêtre où l'
les tables sont affichées) et de définir
'Les Enregistrements uniques' à 'Oui'
l'aspect un peu étrange
DISTINCTROW
mot-clé à l'SELECT
clause, par exemple,:
Cela résout beaucoup de problèmes mettant en cause ce message d'erreur qu'il est presque ridicule.
Que de MS Access en un mot - si vous ne connaissez pas le secret commercial solution de contournement pour le problème x, vous pouvez prendre des jours à essayer de trouver la réponse. Pour connaître les 10 000 solutions de contournement EST de l'Accès au programme. Est-ce suffisant d'un message pour les non-initiés ?
Ben
Cela a fonctionné pour moi (Access 2000)
Je nai pas pas lu tout le thread, mais c'est la solution que j'utilise:
et qui fonctionne très bien dans MS Access pour moi.
Ma solution a été de changer mon sql.
J'ai eu le même message d'erreur ("l'Opération doit utiliser une requête de mise à jour") à l'aide d'Access 2010 et j'ai été l'exécution d'une mise à jour simple requête avec une jointure interne. Je me suis contenté d'ajouter une clé primaire pour la table, j'ai été le rejoindre sur (déjà eu un, bien sûr, sur la table, j'ai été mise à jour) et tout a fonctionné.
Pour celui-ci: mise à JOUR t1 t1.f2 = (SELECT t2.f2 DE t2 OÙ t2.f1 = t1.f1)