2017-07-31 22 views
1
CREATE TABLE dbo.Temp_Test 
(Main_id int, 
    Unique_id char(1) ) 

insert into Temp_Test(Main_id,Unique_id) 
values (1, 'a'), 
     (2, 'b'), 
     (3, 'c'), 
     (4, 'c') 

SELECT r.Main_Id, r.Unique_ID, x.Main_Id, x.Unique_id 
FROM  dbo.Temp_Test r 
     LEFT JOIN dbo.Temp_Test x 
       ON r.Unique_ID = x.Unique_ID 
        AND x.Main_Id < r.Main_Id 
WHERE  x.Main_Id IS NULL 

このクエリの仕組みを理解しようとしています。ステップでそれを実行すると、それはちょうど私をもっと混乱させました。それはこのSQL Left join自体はどのように機能しますか?

SELECT r.Main_Id, r.Unique_ID, x.Main_Id, x.Unique_id 
    FROM  dbo.Temp_Test r 
      LEFT JOIN dbo.Temp_Test x 
        ON r.Unique_ID = x.Unique_ID 

としてだけで走っていますときに結果が

Main_ID Unique_ID Main_id Unique_id 
1   a   1  a 
2   b   2  b 
3   c   3  c 
3   c   4  c 
4   c   3  c 
4   c   4  c 

に変身しかしx.main_id < r.main_idフィルタを実行したときに、我々はに何が起こった

Main_ID Unique_ID Main_id Unique_id 
1   a   NULL  NULL 
2   b   NULL  NULL 
3   c   NULL  NULL 
4   c   3   c 

を取得します4 C 4列?

+2

4厳密には( '<')未満ではありません4. 4は( '<=')以下です。 – Welbog

+0

行は完全に省略されていますか? – user8395689

+2

左側の「4 C」はすでに出力に表示されています。 – Welbog

答えて

1

左結合を実行すると、左のテーブルのすべてのレコードが結果の一部になります。クエリが2番目のテーブルから一致するものを見つけた場合、結果に結果が表示されます。そうでない場合はNULLが出力されます。

最初のクエリでは、Unique_idとの一致が見つかったため、可能なすべてのペアで結果が得られました。

2番目のクエリでは、Main_idが1番目のテーブル(1,2,3の場合)より大きいレコードがないため、2番目のテーブルにNULLが返されました。 一方、左側のテーブルのMain Id 4が右側のテーブルの3より大きいため、結果が表示されていました。 左側のテーブルのMain_id 4が右側のテーブルのMain_id 4よりも大きくないため、結果の一部ではありません。

+0

左のテーブルの4が右のテーブルの4より大きくないので、1 A 1 Aと同様に、どのようにしてヌル値を受け取ることができませんでした。 2 B 2 Bと3 C 3 Cレコード? – user8395689

+0

は@welbogが言っているように、すでに4 C 3 Cという結果になっています。したがって、NULL値の結果は表示されません。正しいテーブルの中に何かがあったら、それはあなたにそれを与えました。 –

+0

私はあなたがそれをよりよく理解できるように、より多くの列と行を追加して、異なるフィルターでどのように動作するかを確認することをお勧めします。 –

関連する問題