消息209,级别16,状态1,第4行歧义列名称“ DonorID”。消息209,级别16,状态1,第1行不明确的列名称“ DonorID”

时间:2018-11-02 00:55:02

标签: sql-server

我是新来的,上课了。我很难解决这个问题。任何帮助将不胜感激。

谢谢。

Select 
    LastName, FirstName, DonorID, FundName, TotalPledged
From 
    Donors.dbo.Donor, Donors.dbo.Pledge
Where   -- (marc_s): this was missing from your original query .....
    Donors.dbo.donor.donorID = Donors.dbo.Pledge.DonorID
    And DonorID = 59034;

2 个答案:

答案 0 :(得分:2)

您正在混合使用隐式和显式连接语法,应该使用后者:

SELECT LastName, FirstName, p.DonorID, FundName, TotalPledged
FROM Donors.dbo.Donor d
INNER JOIN Donors.dbo.Pledge p
    ON d.donorID = p.DonorID
WHERE d.DonorID = 59034;

您缺少WHERE关键字,也缺少用于显式联接的ON关键字。

答案 1 :(得分:1)

出现错误的原因是因为列DonorID出现在两个表中,所以SQL引擎不知道在SELECT列表中显示哪个值,或者在WHERE子句中要过滤哪个值。

为了避免此错误并提高可读性,最佳实践是为表名添加别名,然后将这些表别名应用于查询中任何位置出现的每个列名。它消除了运行时对SQL引擎的歧义,为您在需要对查询进行故障排除时为您消除了歧义,为您的伙伴(不是您时必须承担轮班轮换的伙伴)以及为您负责工作的人消除了歧义。你继续前进。

关于您的JOIN语法,我强烈希望使用ANSI-92显式连接,但是奇怪的是,宗教战争仍在肆虐。看看this pretty old post双方的论点。