Неоднозначная ошибка имени столбца, как я могу это исправить? - PullRequest
10 голосов
/ 16 июля 2009
1. Users 4 Cols
UserID - UserName - RealName - Flags

2. UsersGroups 2 Cols
UserID - GroupID

3. Groups 3 Cols
GroupID - GroupName - Flags

Что я хочу сделать, это выбрать конкретное Имя пользователя , то есть USERA, и обновить столбец Flags. но я также хочу обновить столбец Flags в таблице Groups до того же значения.

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'

но я продолжаю получать: неоднозначное имя столбца 'Флаги'.

если я сделаю Set Groups.Flags = @Var я получил : Сообщение 4104, уровень 16, состояние 1, строка 1 Не удалось связать многокомпонентный идентификатор «Groupy.Flags».

Ответы [ 8 ]

18 голосов
/ 16 июля 2009

Вам необходимо добавить псевдоним для таблицы групп. Изменить это:

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'

К этому:

UPDATE g -- change dbo.Groups here to simply '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'
5 голосов
/ 16 июля 2009

Проблема в том, что вы не указали имя таблицы для поля «Флаги» и, вероятно, оно существует в нескольких таблицах в запросе. Добавьте имя таблицы в формате «Tablename.flags» в начало всех ссылок, чтобы устранить проблему.

3 голосов
/ 16 июля 2009
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'
  • В предложении from - целью обновления должна быть первая таблица.
  • В предложении update - использовать псевдоним таблицы, созданный в предложении from.
  • В предложении set - использовать псевдоним таблицы, созданный в предложении from.

Я когда-то знал причины, по которым этот танец нужно делать таким образом - теперь я просто делаю это по привычке. Я подозреваю, что это как-то связано с двойным предложением TSOM FROM в операторах DELETE и возможностью говорить о двух разных экземплярах таблицы Groups между предложением FROM и UPDATE ... или даже двух разных экземплярах таблицы Groups в from предложение (подумайте о самостоятельном присоединении).

2 голосов
/ 16 июля 2009

Попробуйте SET Groups.Flags = @var во втором обновлении

2 голосов
/ 16 июля 2009
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'
2 голосов
/ 16 июля 2009

Просто введите alias.Flags или TableName.Flags в операторе обновления.

Вот так и получается:

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'
1 голос
/ 16 июля 2009

Вот обходной путь (хотя, возможно, и не лучшее решение):

UPDATE dbo.Groups
SET Flags = @var
FROM dbo.UsersGroups ug INNER JOIN dbo.Groups g ON g.GroupID = ug.GroupID
WHERE ug.UserID IN (SELECT UserID FROM dbo.Users WHERE UserName = 'UserA')
1 голос
/ 16 июля 2009

youTableAlias.Flags

В вашем примере: г.Флаги

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...