22

我有一个无法执行的 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 来执行查询。

更新
另外,我尝试CreatedDateSELECT列列表中删除该列,然后查询不再需要ORDER BY. 所以这个查询也有效:

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

4 回答 4

47

您正在选择该CreatedDate列两次。

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

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

于 2013-05-02T15:45:44.737 回答
8

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

于 2013-05-02T15:50:05.530 回答
2

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

select 
    p.PersonID, 
    CreatedDate [create_date], 
    * 
from 
    dbo.Person p join 
    dbo.PotentiallyFraudulentPeople pfp on p.PersonID= pfp.PersonID 
order by 
    [create_date] 
于 2017-11-15T19:34:31.700 回答
0

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

于 2017-04-12T17:02:57.887 回答