SQL连接具有特定条件的两个表

Use*_*384 3 sql select join left-join where-clause

表A结构:

在此输入图像描述

表B结构:

在此输入图像描述

上面是两个表,TableB.TableARelationID是一个用于映射表A的relationID.

期望的输出:

在此输入图像描述

所需的结果将是TableA.RecordID和TableB.Text,但只有表B中的Type 2,即忽略Type 1

下面是我使用的SQL查询:

SELECT tablea.recordid, 
       tableb.text 
FROM   tablea 
       LEFT JOIN tableb 
              ON tablea.relationid = tableb.tablearelationid 
WHERE  type = 2 
Run Code Online (Sandbox Code Playgroud)

但上面的查询会输出:

在此输入图像描述

即,删除了RecordID 1,因为"where"子句被过滤了.

那么如何从表A中显示RecordID 1?

Gar*_*thD 6

您需要将type = 2过滤器移动到连接条件:

SELECT  TableA.RecordID, TableB.Text 
FROM    TableA 
        LEFT JOIN TableB 
            ON TableA.RelationID = TableB.TableARelationID 
            AND TableB.Type = 2;
Run Code Online (Sandbox Code Playgroud)

考虑一下这样的结果:

SELECT  TableA.RecordID, TableB.Text, TableB.Type
FROM    TableA 
        LEFT JOIN TableB 
            ON TableA.RelationID = TableB.TableARelationID;
Run Code Online (Sandbox Code Playgroud)

你会得到的

RecordID | Text | Type
  1      | NULL | NULL
  2      |   B  |  2
  3      |   C  |  2
  4      |   D  |  2
Run Code Online (Sandbox Code Playgroud)

然后你在类型列上进行过滤,因此对于recordID = 1,你有NULL = 2哪个是假的(它实际上不是假的,它是null,但它不是真的),所以这个记录从最终结果中消除.

每当您离开加入时,您必须在连接条件中应用要应用于左表的任何过滤条件而不是在哪里,否则您实际上将其转换为内连接.