2009-07-16 51 views
10
1. Users 4 Cols 
UserID - UserName - RealName - Flags 

2. UsersGroups 2 Cols 
UserID - GroupID 

3. Groups 3 Cols 
GroupID - GroupName - Flags 

我想要做的是選擇一個特定的用戶名即USERA並更新Flags列。但我也想將Groups表中的Flags列更新爲相同的值。不明確的列名錯誤,我該如何解決?

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' 

但我不斷收到:不明確的列名'Flags'。

,如果我做集Groups.Flags = @var 我得到: 消息4104,級別16,狀態1,行 多部分標識符 「Groupy.Flags」 無法綁定。

+0

是說使用g.Flags是不正確的,因爲你不能在UPDATE的那部分使用別名的答案......你需要使用Groups.Flags ...這個錯誤是因爲當你進行連接時,它對於是否更新用戶或組中的標誌 – 2009-07-16 15:05:21

+0

@Chris感到困惑,我經常在set子句中使用表別名,但是要遵循的規則以允許這一點。 – 2009-07-16 15:07:01

+0

無論使用g還是Groups,我都會得到相同的錯誤... – Alan 2009-07-16 15:08:28

回答

1

youTableAlias.Flags

在您的例子:g.Flags

18

您需要添加的別名組表。更改此:

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

只是做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' 
2
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' 
5

的問題是,你有沒有爲字段「標誌」指定表名,它可能在多個表中存在的查詢。將表格名稱以「Tablename.flags」格式添加到所有引用的前面以解決問題。

2

嘗試 SET Groups.Flags = @var在你的第二個更新

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子句中創建的表別名。

我曾經知道這種舞蹈需要這樣做的原因 - 現在我只是出於習慣。我懷疑它與DELETE語句中的TSQL的雙重FROM子句有關,並且有可能在FROM和UPDATE子句之間談論兩個不同的GROUP表實例...甚至在兩個不同的GROUP表實例之間條款(認爲自我加入)。

1

這裏有一個解決方法(雖然也許不是最好的解決方案):

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