模糊列名称错误,我该如何解决?

时间:2009-07-16 14:58:22

标签: sql sql-server tsql

1. Users 4 Cols
UserID - UserName - RealName - Flags

2. UsersGroups 2 Cols
UserID - GroupID

3. Groups 3 Cols
GroupID - GroupName - Flags

我想要做的是选择一个特定的 UserName 即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,第1行 无法绑定多部分标识符“Groupy.Flags”。

9 个答案:

答案 0 :(得分:18)

您需要为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'

答案 1 :(得分:5)

问题是您没有为字段“Flags”指定表名,它可能存在于查询中的多个表中。将表格名称“Tablename.flags”添加到所有引用的前面以解决问题。

答案 2 :(得分: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子句之间讨论Groups表的两个不同实例...甚至是from表中的Groups表的两个不同实例(想想自我加入)。

答案 3 :(得分:2)

只需在update语句中执行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'

答案 4 :(得分: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 :(得分:2)

尝试 第二次更新中的SET Groups.Flags = @var

答案 6 :(得分:1)

youTableAlias.Flags

在您的示例中:g.Flags

答案 7 :(得分: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')

答案 8 :(得分:0)

为条件的ON子句提及正确的表格列

FROM数据库2.学生 LEFT JOIN数据库2.学院 开启student.college_id = college.college_id ORDER BY college.college_id

由于表之间的名称混淆而发生此错误 使用表名称正确提及“表”列 这会工作..