Ошибка неоднозначного имени столбца, как его исправить?
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')