内部连接错误(多部件标识符仅在使用时无法绑定错误)

时间:2013-03-14 16:06:42

标签: sql sql-server sql-server-2008 tsql

我在SQL SERVER 2008上的存储过程中编写了以下查询:  (我故意截断表名,也使查询更容易阅读)

1)

select Pr.Id from D D , DP DP, P P, Pr Pr
where D.Id = DP.Id AND DP.Id = P.Id AND P.Id = Pr.Id;

并且它完全正常,但是当我使用Inner Joins

编写相同的查询时

2)

select Pr.PId  from D D
INNER JOIN DP DP ON D.Id = DP.Id
INNER JOIN P P ON DP.Id = P.Id 
INNER JOIN Pr Pr ON P.Id = Pr.Id

它会抛出一个错误:多部分标识符" Pr.Id"无法受约束。

3) 我再次尝试了另一个版本:

select Pr.Id  from Pr Pr
INNER JOIN P P ON Pr.Id = P.Id
INNER JOIN DP DP ON P.Id =  DP.Id
INNER JOIN Dealer D ON DP.Id = D.Id

我不明白为什么1& 3工作,而2工作。 虽然我觉得所有这些都意味着同样的事情。

3 个答案:

答案 0 :(得分:2)

由于示例2)和3)之间的区别是Pr表的位置,并且由于您的错误引用Pr.Id,我的假设是您尝试使用{{{ 1}}在您引用连接序列中的表之前。

一个简单的例子:

Pr

会给你错误:

select a.ID
from a
join b on a.id = b.id and a.id = c.id <--- referenced too early.
join c on c.id = b.cid

由于您尝试在表连接序列出现之前引用该表别名。

答案 1 :(得分:0)

你的Pr桌上需要别名吗?因为你缩短了你的表名,我无法说出来。按原样发布代码将有助于我们确定问题。

尝试:

select Pr.PId  from D D
INNER JOIN DP DP ON D.Id = DP.Id
INNER JOIN P P ON DP.Id = P.Id 
INNER JOIN Pr Pr ON P.Id = Pr.Id

答案 2 :(得分:0)

2)你有

  

选择Pr.PId

在1)和3)中你有

  

选择Pr.Id

Pr有PId列吗?还是只是一个错字?