【问题标题】:Why is this SQL Query causing an "Ambiguous column name" error?为什么此 SQL 查询会导致“列名不明确”错误?
【发布时间】:2013-05-02 15:43:47
【问题描述】:

我有一个无法执行的 SQL 查询:

select p.PersonID, CreatedDate, * from dbo.Person p 
join dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by CreatedDate 

Person 表的 PK 为 PersonID (int)。 PotentiallyFraudulentPeople 视图是对 Person 表的查询,它与其他一些表连接以确定我们是否信任某个人。 PotentiallyFraudulentPeople 视图只有一列:PersonID

当我尝试执行此查询时,我收到此错误:

消息 209,第 16 级,状态 1,第 3 行
不明确的列名“CreatedDate”。

我知道这个错误告诉我CreatedDate 列名不明确,我需要在它前面加上表的别名“p”。

此查询有效:

select p.PersonID, CreatedDate, * from dbo.Person p 
join dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by p.CreatedDate 

我不明白为什么我需要在ORDER BY 语句而不是SELECT 列列表中使用“p”别名。另外,我不明白为什么我需要使用表别名,因为 PotentiallyFraudulentPeople 视图甚至没有 CreatedDate 列。

谁能解释这种奇怪的行为?

我正在使用 SQL Server 2008 和 SSMS 来执行查询。

更新
另外,我尝试从SELECT 列列表中删除CreatedDate 列,然后查询不再需要ORDER BY 中的“p”别名。所以这个查询也有效:

select p.PersonID, * from dbo.Person p 
join dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by CreatedDate 

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您选择了两次CreatedDate 列。

    1. 明确通过CreatedDate
    2. 隐式通过*

    它不知道您要对哪个出现进行排序 - 而且它显然没有意识到这两个出现引用同一列。

    【讨论】:

    • 这听起来像是 SQL Server 的奇怪行为,但它解释了我的问题。谢谢!我会尽快接受这个答案。
    • 刚刚遇到这个问题,这就是原因,没有意识到这是订单的问题
    【解决方案2】:

    名称不明确的原因与order by子句允许使用别名有关,因此p.CreateDt和*.CreateDt都是CreateDt的别名。由于 order by 允许别名,所以无法解析

    【讨论】:

      【解决方案3】:

      您可以为“CreatedDate”添加别名并使用别名对其进行排序

      select 
          p.PersonID, 
          CreatedDate [create_date], 
          * 
      from 
          dbo.Person p join 
          dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
      order by 
          [create_date] 
      

      【讨论】:

        【解决方案4】:

        您必须指定 CreateDate 来自哪个表。这意味着您在两个表中都有此列名。所以要么 p.CreatedDate 要么 pfp.CreatedDate。

        【讨论】:

        • 仅供参考,您正在回答 4 年前回答的问题。回答时请记住发布日期。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多