Comment mettre à JOUR une table de SQL Server avec plusieurs Jointures sur la table mise à jour? (À PARTIR DE LA REJOINDRE)
Comment mettre à JOUR une table de SQL Server avec plusieurs Jointures sur la table mise à jour?
Dans MySQL, vous pouvez définir un Alias pour la mise à jour de la table, mais comment ça fonctionne avec TSQL.
UPDATE recert.ou --#1-- In MSSQL/TSQL no alias allowed
SET parent_id = o2.ID
FROM recert.ou as O
JOIN recert.country C ON C.ID = O.country_id
JOIN recert.ou P ON O.parent_id = P.ID and p.country_id <> O.country_id
JOIN recert.ou o2 on o2.name = p.name and c.ID = o2.country_id
JOIN recert.country as c2 on c2.ID = o2.country_id
WHERE O.ID = o2.ID
-
RESULT: *The table 'o' is ambiguous.*
Pourquoi voudriez-vous alias
Qu'advient-il si vous avez
Original:
Quelle version de Sql Server? J'ai juste vérifié par rapport à 2005, et oui, vous pouvez utiliser l'alias dans l'instruction update.
SQL Server 2008 R2:
o
comme o
?Qu'advient-il si vous avez
UPDATE O1 SET parent_id = O2.ID FROM o AS O1 blah blah blah...
? TSQL t permettre à un alias pour apparaître dans la UPDATE
déclaration. Mais je n'ai jamais essayé l'alias de la table à son propre nom avant.Original:
FROM recert.o AS o
Quelle version de Sql Server? J'ai juste vérifié par rapport à 2005, et oui, vous pouvez utiliser l'alias dans l'instruction update.
SQL Server 2008 R2:
Msg 8154, Level 16, State 1, Line 2 The table 'recert.o' is ambiguous.
Son parce que la JOIN recert.o P
et JOIN recert.o o2
.OriginalL'auteur hoerf | 2012-05-29
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne sur Sql Violon.
Je suppose que le problème se pose parce que vous avez essayé de re-alias un alias, mais je ne suis pas sûr.
recert
est le shema et la table estou
. ->recert.ou as o
. J'ai modifier la question.penser à cela comme une preuve de concept. Il suffit d'ajouter .ou à chaque recert dans la requête ci-dessus.
Que votre requête est actuellement, remplacer
update recert.ou
avecupdate o
de ses la même, comme dans mon quetstion
Le point a été d'utiliser des alias dans la mise à jour, et que vous utilisez le nom de la table.
OriginalL'auteur Nikola Markovinović
Vous pouvez déplacer le tout dans la clause where:
C'est pas mon style préféré de jointures, mais cela devrait être suffisant pour vos besoins.
Cependant, en TSQL, je voudrais vraiment faire ce qui suit. Créer une requête qui renvoie la nouvelle valeur de mise à jour pour chaque id. Ensuite, écrivez une requête avec le format suivant:
UPDATE recert.ou SET parent_id = o2.[ID] FROM recert.ou AS O, recert.country, recert.ou AS P, recert.ou as o2, recert.country c2, recert.country c WHERE O.ID = o2.ID AND C.ID = O.country_id AND O.parent_id = P.ID and p.country_id <> O.country_id AND o2.name = p.name and c.ID = o2.country_id AND c2.ID = o2.country_id
OriginalL'auteur Gordon Linoff
Vous avez juste besoin de retirer le nom de l'alias pour o tableau
FROM recert.o AS O
- je utilisero
un alias dans leJOIN ... o.country_id
OriginalL'auteur praveen
auto-joint la mise à jour
OriginalL'auteur Prakash BS