为什么此SQL查询导致“不明确的列名称”错误?

时间:2013-05-02 15:43:47

标签: sql sql-server

我的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

当我尝试执行此查询时,出现此错误:

  

Msg 209,Level 16,State 1,Line 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语句中使用'p'别名,而不是在SELECT列列表中。另外,我不明白为什么我需要使用表别名,因为PotentiallyFraudulentPeople视图甚至没有CreatedDate列。

任何人都可以解释这种奇怪的行为吗?

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

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

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

4 个答案:

答案 0 :(得分:33)

您选择了CreatedDate列两次。

  1. 明确地通过CreatedDate
  2. 隐含地通过*
  3. 它不知道你想要排序的是什么 - 它显然没有意识到两个出现都是指同一列。

答案 1 :(得分:6)

名称含糊不清的原因与order by子句允许使用别名这一事实有关,因此p.CreateDt和* .CreateDt都是CreateDt的别名。由于order by允许别名,因此无法解析

答案 2 :(得分:1)

您可以为“CreatedDate”添加别名,并使用别名

对其进行排序
select 
    p.PersonID, 
    CreatedDate [create_date], 
    * 
from 
    dbo.Person p join 
    dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by 
    [create_date] 

答案 3 :(得分:0)

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