2012-04-09 14 views
3

私は、列(ベータ、デルタ、ガンマ)でテーブル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 

答えて

6

トップクエリはBからAに関するON句にない状態を有していません。あなたがやっているのは、すべての行をBから、の順番に並べて、Betaの行のためにGammaと注文し、その結果セットをAに加えることです。 ABの間に直接の関係が指定されていないため、Bのサブセット(基本的にはが表示され、Betaが一意である場合はBとなります)を、Aにクロス結合します。

もう少し詳しく説明すると、TableA.SomeColumn = TableB.SomeColumnがないテーブルにテーブルを追加すると、基本的にはTableBの完全な結果セットが得られますTableAの行に結合された結果セットを制限する方法がないため、TableAのすべての行に完全な結果セットがあります。私はそれが助けて欲しい

+0

これは完璧で、私が何を期待しているのか聞いていました。私はちょうどそれがドキュメントに記載されていることを見つけるのに苦労していました。私はまた、Bが完全に(あなたが指摘したように、ユニークなベータの行だけ)Aには参加していないと感じましたが、私はそれまでの研究を受けていませんでした。 –

関連する問題