左外连接具有连接条件

时间:2011-12-10 04:09:10

标签: sql join

有时,以下陈述令人困惑,至少对我而言,尽管我已经使用了很长时间的连接。

这里令人困惑的部分是,考虑到第二个左连接

SELECT * FROM table1  
    LEFT JOIN table2 ON table1.id=table2.id  
    LEFT JOIN table3 ON table2.id=table3.id;
  1. 将被视为左表 - table1或table2(table2参与连接条件)。

  2. 如果我没记错的话,左连接结果包含来自连接条件的匹配结果和来自左表的不匹配结果。如果左表是table1(从第1点开始),那么table1中的行将是不匹配的,因为它不参与连接条件。

2 个答案:

答案 0 :(得分:2)

  1. 加入table1table2的结果是第二次加入中的左表。
  2. 如果id 1中有table1id 1中没有table2table3包含id 1,那么id 1的行将会像:
  3. table1.id  table2.id  table3.id
    1          NULL       NULL
    

    连接按声明顺序计算。这意味着您要table3加入table1table2的结果。

答案 1 :(得分:1)

查询将返回Table1中的所有行。只有在Table2id之间Table1值相等的情况下,它才会加入来自Table2的行。它还会加入来自Table3的行,其中id值在(Table1Table2)和Table3的联接结果之间相等。因此,如果Table1Table2之间的第一次连接产生了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加入的行。换句话说,第二个联接不是Table2Table3,而是Table1Table2Table3左联接的结果。因此,在我的示例中,即使Table2Table3都有ID为5的记录,但这些记录未包含在结果集中,因为Table1没有记录ID为5。