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;

完全に正常に動作しますが、内部結合を使用して同じクエリを作成すると

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

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 に答える
0

2)であなたは持っています

Pr.PIdを選択

1) と 3) の間、あなたは持っています

Pr.IDを選択

Pr には PId 列がありますか? それともただのタイプミス?

于 2013-03-14T23:58:22.227 に答える