sql - 为什么此SQL查询导致 “Ambiguous column name”错误?

标签 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表的PK为PersonID(int)。 PotentiallyFraudulentPeople View 是对Person表和其他一些表的查询,以确定我们是否信任某个人。 PotentiallyFraudulentPeople View 只有一列:PersonID

当我尝试执行此查询时,出现以下错误:

Msg 209, Level 16, State 1, Line 3
Ambiguous column name '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 View 甚至没有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 

最佳答案

您要选择CreatedDate列两次。

  • 通过CreatedDate显式表示。
  • 通过*隐式地进行。

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

    关于sql - 为什么此SQL查询导致 “Ambiguous column name”错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342271/

    相关文章:

    sql - T-SQL计算列如何获取ISO周数

    sql - 具有多个连接字段的 Django ORM 查询

    mysql - 将 LIKE 与多行子查询结合使用时如何避免错误 1242

    C# 使用 OLEDB 连接调用存储过程不起作用

    php - SQL没有标识符,只有时间戳

    c# - 在 C# 中调用返回值的参数化存储过程

    mysql - mysql json_contains 可以不区分大小写吗?

    sql - 函数不返回预期值

    sql - 如何检查日期是否在多个范围之间?

    sql-server - 数据库中缺少外键对 EF 生成的 sql 有影响吗?