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行怎么了?
答案 0 :(得分:1)
当您进行左连接时,左表中的所有记录都将成为结果的一部分。如果查询从第二个表中找到匹配,它将在结果中显示它们,否则将只打印NULL。
在第一个查询中,它确实找到了与Unique_id的匹配,因此它为您提供了所有可能对的结果。
在第二个查询中,由于第一个表中没有Main_id更大的记录(对于1,2,3),它为第二个表返回NULL。 然而,它从左边的表中找到Main Id 4,从右边的表中找到大于3,所以它显示了结果。 由于左表中的Main_id 4不大于右表中的Main_id 4,因此这不是结果的一部分。