10
votes

Erreur de nom de colonne ambiguë, comment puis-je le réparer?

UPDATE dbo.Users
SET Flags = @var
WHERE UserName = 'UserA'

UPDATE dbo.Groups
SET Flags = @var
FROM dbo.Users u INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID
INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID
WHERE u.UserName = 'UserA'

6 commentaires

Les réponses qui disent que l'utilisation G.Flags sont incorrectes car vous ne pouvez pas utiliser un alias dans cette partie de la mise à jour ... Vous devez utiliser des groupes.Flags ... L'erreur est parce que lorsque vous faites la jointure à laquelle il est confondu avec Mettre à jour les drapeaux des utilisateurs ou des groupes


@Chris, j'utilise fréquemment des alias de table dans la clause définie, mais il y a des règles à suivre pour permettre cela.


Je reçois la même erreur, peu importe si j'utilise g ou groupes ...


@David - utilisez-vous MS SQL? Avez-vous une référence pour permettre cela?


Alan - Voir ma réponse ci-dessous ... essayez ça


Ah, ive vient de se rendre compte, c'est parce que je tente de définir les drapeaux pour définir DBO.GROUP.FLAGS = DBO. Groupe.Flags | 512


9 Réponses :


1
votes

YOUTABLEALIAS.FLAGS

Dans votre exemple: g.flags


0 commentaires

18
votes

Vous devez ajouter l'alias pour la table des groupes. Modifiez ceci: xxx

à ceci: xxx


2 commentaires

MSG 4104, niveau 16, état 1, ligne 1 L'identifiant multi-pièces "Groupe.Flags" n'a pas pu être lié.


J'ai changé le début de la déclaration de mise à jour pour simplement "mettre à jour g" au lieu de "Mettre à jour DBO.Groups". S'il vous plaît essayez ça.



2
votes

juste faire alias.flags ou nom de nom.flags dans l'instruction de mise à jour.

Donc cela devient ceci: p>

UPDATE dbo.Users
     SET Flags = @var
     WHERE UserName = 'UserA'

UPDATE g
   SET g.Flags = @var
FROM dbo.Users u 
INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID
INNER JOIN dbo.Groups g       ON g.GroupID = ug.GroupID
WHERE u.UserName = 'UserA'


0 commentaires

2
votes
UPDATE dbo.Groups Set dbo.Groups.Flags = @var FROM dbo.Users u INNER JOIN dbo.UsersGroups ug ON u.UserID = ug.UserID INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID WHERE u.UserName = 'UserA'

0 commentaires

5
votes

Le problème est que vous n'avez pas spécifié le nom de la table pour le champ "Drapeaux" et il existe probablement dans plusieurs table dans la requête. Ajoutez le nom de la table dans le format "Tablename.Flags" à l'avant de toutes les références pour résoudre le problème.


0 commentaires

2
votes

essayer Set groups.flags = @var dans votre deuxième mise à jour


0 commentaires

3
votes
UPDATE g
SET g.Flags = @var
FROM
  dbo.Groups g
    INNER JOIN
  dbo.UsersGroups ug
    ON g.GroupID = ug.GroupID
    INNER JOIN
  dbo.Users u
    ON u.UserID = ug.UserID
WHERE u.UserName = 'UserA'

In the from clause - the update target needs to be the first table there.
In the update clause - use the table alias created in the from clause.
In the set clause - use the table alias created in the from clause.
I once knew the reasons that this dance needs to be done this way - now I just do it out of habit.  I suspect it has something to do with TSQL's double FROM clause in DELETE statements, and the possibility of talking about Two different instances of the Groups table between the FROM and UPDATE clause... or even Two different instances of the Groups table in the from clause (think self-join).

0 commentaires

1
votes

Voici une solution de contournement (bien que peut-être pas la meilleure solution): xxx


2 commentaires

Ah, ive vient de se rendre compte, c'est parce que je tente de définir les drapeaux pour définir DBO.GROUP.FLAGS = DBO. Groupe.Flags | 512


OK, je viens d'utiliser Select g.Flags de dbo.groups g inner rejoindre dbo.usergroups ug on g.groupid = ug.groupide interne interne dbo.utilisateurs u on u.userid = ug.userid où u.username = 'usera' | 512 à la place du DBO. Groupe.Flags | 512



0
votes

mentionner la colonne de table correcte pour la clause ON pour conditionner

de base de données2.Student étudiant Base de données de gauche de gauche2.college College Sur étudiant.college_id = college.College_id Commandez par college.College_id

Cette erreur se produit en raison de la confusion du nom entre la table Mentionnez la colonne de table correctement avec le nom de la table Cela fonctionnerait ..


0 commentaires