【问题标题】:"Ambiguous column name" when joining tables连接表时出现“不明确的列名”
【发布时间】:2015-07-02 19:45:00
【问题描述】:

我很难从加入这两个表中提取用户 ID。

我的目标是找到所有超过 200 的假期余额和所有活动的用户 ID,但我不断得到一个不明确的用户 ID 列名称。

如果我尝试提取其他任何内容,我的查询确实有效,但我想提取 UserID。对我的查询的任何帮助将不胜感激。

这是我的表格及其列:

USER

ID (PK)
UserID
Firstname
Lastname
Email
Active (Bool) 

余额

UserID (PK)
VacationBalance

这是我的查询:

SELECT UserID FROM dbo.VacBal as I join dbo.User as T
on I.userid = T.userid 
WHERE VacationBalance > 200 and active = 1 

这是我遇到的错误:

消息 209,级别 16,状态 1,行 1 不明确的列名称“用户 ID”。

【问题讨论】:

  • 阅读错误信息。在选择输出中使用T.UserID I.UserID 来消除歧义(SQL Server 不关心它们是否是相同的值)。

标签: sql-server


【解决方案1】:

因为每个表都包含一个UserID 列,您需要通过在SELECT 语句中包含表别名来指定您希望UserID 来自哪个列:

       v
SELECT T.UserID FROM dbo.VacBal as I join dbo.User as T
on I.userid = T.userid 
WHERE VacationBalance > 200 and active = 1

【讨论】:

    【解决方案2】:
    SELECT T.UserID 
    FROM dbo.VacBal as I 
    join dbo.User as T
    on I.userid = T.userid 
    WHERE VacationBalance > 200 and active = 1
    

    【讨论】:

    • 谢谢!正是我需要的
    【解决方案3】:

    出现此错误的原因是当您连接两个或多个表时,它将为选择提供一个公共记录集,而有多个具有相同名称的列,因此系统无法理解哪个值您想放在那里,这就是系统在列名错误消息中生成歧义的原因。

    为避免此错误,请确保为列名添加表名或表别名作为列名的前缀,这些列存在于 1 个以上的表中。这是一个不会产生错误的更新的 SELECT 语句:

    SELECT 
        T.UserID 
    FROM dbo.VacBal as I 
        join dbo.User as T on I.userid = T.userid 
    WHERE VacationBalance > 200 and active = 1 
    

    最好始终在列名前加上表名或表别名,这样,万一将其他列添加到与另一个表中的现有列同名的表中,您就不会遇到此错误.

    【讨论】:

      【解决方案4】:

      试试这个:

      SELECT UserID
        FROM dbo.VacBal AS I JOIN dbo.User AS T
               USING(userid)
       WHERE VacationBalance > 200 AND active = 1
      

      【讨论】:

        猜你喜欢
        • 2012-10-04
        • 2014-02-25
        • 1970-01-01
        • 1970-01-01
        • 2014-02-08
        • 2018-09-14
        • 1970-01-01
        • 2014-05-29
        • 2021-03-05
        相关资源
        最近更新 更多