[英]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
列。
CreatedDate
。 *
。 它不知道你想要排序的是什么 - 它显然没有意识到两个出现都是指同一列。
名称含糊不清的原因与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.