这个SQL Left连接本身如何工作?

时间:2017-07-31 18:40:52

标签: sql sql-server sql-server-2012

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

我正在尝试了解此查询的工作原理。当它分步运行时,它让我更加困惑。当它像

一样运行时
   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&lt;运行时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 C行怎么了?

1 个答案:

答案 0 :(得分:1)

当您进行左连接时,左表中的所有记录都将成为结果的一部分。如果查询从第二个表中找到匹配,它将在结果中显示它们,否则将只打印NULL。

在第一个查询中,它确实找到了与Unique_id的匹配,因此它为您提供了所有可能对的结果。

在第二个查询中,由于第一个表中没有Main_id更大的记录(对于1,2,3),它为第二个表返回NULL。 然而,它从左边的表中找到Main Id 4,从右边的表中找到大于3,所以它显示了结果。 由于左表中的Main_id 4不大于右表中的Main_id 4,因此这不是结果的一部分。