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

为什么此SQL查询会导致;“不明确的列名”;错误?,sql,sql-server,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表的主键为PersonID(int)。PotentiallyFraudulentPeople视图是对Person表的查询,该表与其他一些表连接,以确定我们是否信任某个

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

select p.PersonID, CreatedDate, * from dbo.Person p 
join dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by CreatedDate 
Person
表的主键为
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
语句中使用“p”别名,而不是在
SELECT
列列表中使用。此外,我完全不明白为什么需要使用表别名,因为
潜在欺诈人员
视图甚至没有
CreatedDate

有人能解释这种奇怪的行为吗

我正在使用SQLServer2008和SSMS执行查询

更新
另外,我尝试从我的
SELECT
列列表中删除
CreatedDate
列,然后查询不再需要
orderby
中的“p”别名。因此,此查询也可以工作:

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

您将选择
CreatedDate
列两次

  • 明确地通过
    CreatedDate
  • 通过
    *
    隐式地

  • 它不知道您要对哪个事件进行排序,而且它显然没有意识到这两个事件都指向同一列。

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

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

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

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

    这听起来像是SQL Server的奇怪行为,但它解释了我的问题。谢谢我会尽快接受这个答案。只是有这个问题,这就是原因,我没有意识到这是订单的问题。顺便说一下,你在回答一个4年前回答的问题。回答时请记住发帖日期。