我的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
答案 0 :(得分:33)
您选择了CreatedDate
列两次。
CreatedDate
。*
。它不知道你想要排序的是什么 - 它显然没有意识到两个出现都是指同一列。
答案 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。