Ошибка неоднозначного имени столбца, как его исправить?

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 я получил: Msg 4104, уровень 16, состояние 1, строка 1 Многозначный идентификатор "Groupy.Flags" не может быть связан.

Ответ 1

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

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'

Ответ 2

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

Ответ 3

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.

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

Ответ 4

Просто выполните 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'

Ответ 5

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'

Ответ 6

Try SET Groups.Flags = @var в вашем втором обновлении

Ответ 7

youTableAlias.Flags

В вашем примере: g.Flags

Ответ 8

Вот обходное решение (хотя, может быть, и не самое лучшее решение):

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')