3

我在 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 不工作。虽然我觉得他们都是一个意思。

4

3 回答 3

3

由于示例 2) 和 3) 之间的区别在于Pr表的位置,并且由于您的错误引用Pr.Id,我的假设是您尝试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

会给你错误:

The multi-part identifier "c.id" could not be bound.

由于您试图在表别名出现在您的连接序列中之前引用它。

于 2013-03-14T16:23:51.403 回答
0

在 2) 你有

选择 Pr.PId

在 1) 和 3) 中,您有

选择 Pr.Id

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

于 2013-03-14T23:58:22.227 回答
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

于 2013-03-14T16:23:57.067 回答