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?
您需要将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,但它不是真的),所以这个记录从最终结果中消除.
每当您离开加入时,您必须在连接条件中应用要应用于左表的任何过滤条件而不是在哪里,否则您实际上将其转换为内连接.