有时,以下陈述令人困惑,至少对我而言,尽管我已经使用了很长时间的连接。
这里令人困惑的部分是,考虑到第二个左连接
SELECT * FROM table1
LEFT JOIN table2 ON table1.id=table2.id
LEFT JOIN table3 ON table2.id=table3.id;
将被视为左表 - table1或table2(table2参与连接条件)。
如果我没记错的话,左连接结果包含来自连接条件的匹配结果和来自左表的不匹配结果。如果左表是table1(从第1点开始),那么table1中的行将是不匹配的,因为它不参与连接条件。
答案 0 :(得分:2)
table1
和table2
的结果是第二次加入中的左表。id 1
中有table1
而id 1
中没有table2
,table3
包含id 1
,那么id 1
的行将会像:
table1.id table2.id table3.id
1 NULL NULL
连接按声明顺序计算。这意味着您要table3
加入table1
和table2
的结果。
答案 1 :(得分:1)
查询将返回Table1
中的所有行。只有在Table2
和id
之间Table1
值相等的情况下,它才会加入来自Table2
的行。它还会加入来自Table3
的行,其中id
值在(Table1
和Table2
)和Table3
的联接结果之间相等。因此,如果Table1
和Table2
之间的第一次连接产生了NULL结果(id
中没有等效的Table2
值),那么第二次连接也将产生NULL结果。例如(使用SQL Server):
DECLARE @Table1 TABLE([ID] INT, [Value] VARCHAR(20))
INSERT INTO @Table1 VALUES(1, 'Table 1 ID 1')
INSERT INTO @Table1 VALUES(2, 'Table 1 ID 2')
INSERT INTO @Table1 VALUES(3, 'Table 1 ID 3')
DECLARE @Table2 TABLE([ID] INT, [Value] VARCHAR(20))
INSERT INTO @Table2 VALUES(1, 'Table 2 ID 1')
INSERT INTO @Table2 VALUES(3, 'Table 2 ID 3')
INSERT INTO @Table2 VALUES(5, 'Table 2 ID 5')
DECLARE @Table3 TABLE([ID] INT, [Value] VARCHAR(20))
INSERT INTO @Table3 VALUES(2, 'Table 3 ID 2')
INSERT INTO @Table3 VALUES(3, 'Table 3 ID 3')
INSERT INTO @Table3 VALUES(5, 'Table 3 ID 5')
SELECT *
FROM @Table1 T1
LEFT JOIN @Table2 T2 ON T1.ID = T2.ID
LEFT JOIN @Table3 T3 ON T2.ID = T3.ID
此查询将产生以下结果:
ID Value ID Value ID Value
-----------------------------------------------------------
1 Table 1 ID 1 1 Table 2 ID 1 NULL NULL
2 Table 1 ID 2 NULL NULL NULL NULL
3 Table 1 ID 3 3 Table 2 ID 3 3 Table 3 ID 3
要回答您的问题,第二次加入会涉及Table1
,因为第二次加入只会包含Table2
中可以与Table1
加入的行。换句话说,第二个联接不是Table2
到Table3
,而是Table1
和Table2
与Table3
左联接的结果。因此,在我的示例中,即使Table2
和Table3
都有ID
为5的记录,但这些记录未包含在结果集中,因为Table1
没有记录ID
为5。