私は、列(ベータ、デルタ、ガンマ)でテーブルBにリンクされている列(アルファ、ベータ)を持つテーブルAを持っていると言います。なぜ最初のクエリがクロス結合に変換されたのか説明できません。 (A.Alpha、A.BetaおよびB.Deltaはユニークなキーです。B.BetaはA.Betaを参照します)。これはなぜ、左結合はクロス結合に評価されますか?
私はこのような選択を行う場合は、次の
SELECT A.Alpha, B_Alias.Gamma FROM A
LEFT JOIN B as B_Alias ON B_Alias.Delta = (
SELECT TOP 1 B_Alias.Delta FROM B
WHERE B.Beta = B_Alias.Beta
ORDER BY B.Gamma desc)
where A.Alpha = 1
結果は多くの行で、A.Alphaは常に選択単一の行に等しく、B_Alias.Gammaは、すべてのガンマを持っています。 A.Alpha = 1
を取り出すと、フルクロスジョインです。作者がAに関連する最新のB列(存在する場合)を取得しようとしましたが、以下のようにして動作するように修正しました。私は誰かがなぜ上記のように動作するのか説明できるかどうか疑問に思っていました。
-- This is the correct query
SELECT A.Alpha, B_Alias.Gamma FROM A
-- Actually join the A and B tables
LEFT JOIN B on B.Beta = A.Beta and B.Delta = (
-- Only get the Most Recent B for any given A
SELECT TOP 1 B.Delta FROM B
WHERE B.Beta = A.Beta
ORDER BY B.Gamma desc)
where A.Alpha = 1
これは完璧で、私が何を期待しているのか聞いていました。私はちょうどそれがドキュメントに記載されていることを見つけるのに苦労していました。私はまた、Bが完全に(あなたが指摘したように、ユニークなベータの行だけ)Aには参加していないと感じましたが、私はそれまでの研究を受けていませんでした。 –