繁体   English   中英

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

[英]Why is this SQL Query causing an “Ambiguous column name” error?

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

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

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

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

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

您正在两次选择CreatedDate列。

  1. 明确地通过CreatedDate
  2. 隐含地通过*

它不知道你想要排序的是什么 - 它显然没有意识到两个出现都是指同一列。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM