表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
但上面的查询会输出:
即。由于过滤了“where”子句,因此缺少RecordID 1。
那么如何从表A中显示RecordID 1?
答案 0 :(得分:5)
您需要将type = 2
过滤器移动到连接条件:
SELECT TableA.RecordID, TableB.Text
FROM TableA
LEFT JOIN TableB
ON TableA.RelationID = TableB.TableARelationID
AND TableB.Type = 2;
考虑这个结果:
SELECT TableA.RecordID, TableB.Text, TableB.Type
FROM TableA
LEFT JOIN TableB
ON TableA.RelationID = TableB.TableARelationID;
你会得到
RecordID | Text | Type
1 | NULL | NULL
2 | B | 2
3 | C | 2
4 | D | 2
然后你在类型列上进行过滤,所以对于recordID = 1,你有NULL = 2
哪个是假的(它实际上不是假的,它是null,但它不是真的),所以这个记录是从最终结果中消除。
每当您离开加入时,您必须在连接条件中应用您希望应用于左表的任何过滤条件而不是在哪里,否则您实际上将其转换为内连接。
答案 1 :(得分:1)
如果您使用Where
语句进行过滤,则该联接将被视为inner join
。
select
TableA.RecordID
, TableB.Text
from
TableA
left join TableB on TableA.RelationID = TableB.TableARelationID AND TableB.Type = 2
答案 2 :(得分:1)
试试这个
select TableA.RecordID, TableB.Text
from TableA
left join TableB on
TableA.RelationID = TableB.TableARelationID AND
TableB.Type = 2
答案 3 :(得分:1)
您应该使用TableB.Type = 2
select TableA.RecordID, TableB.Text
from TableA,
TableB
where TableA.RelationID = TableB.TableARelationID
and TableB.Type = 2
答案 4 :(得分:1)
在Type = 2
条件中添加LEFT JOIN
条件。
试试这个:
SELECT A.RecordID, B.Text
FROM TableA A
LEFT JOIN TableB B ON A.RelationID = B.TableARelationID AND B.Type = 2
答案 5 :(得分:1)
此查询有两个直接版本;
SELECT recordid, CASE WHEN type=2 THEN text ELSE NULL END text
FROM tableA
JOIN tableB
ON tableA.relationid = tableB.tablearelationid;
这将显示类型<>的NULL 2并且不包括两个表中都不存在的行。
SELECT recordid, text
FROM tableA
LEFT JOIN tableB
ON tableA.relationid = tableB.tablearelationid AND type=2;
这会做同样的事情,但包含只在TableA中存在的行为NULL。
答案 6 :(得分:1)
尝试
SELECT tA.RecordID, tB.Text
FROM [TableA] AS tA
LEFT JOIN [TableB] AS tB
ON tA.RelationID = tB.TableARelationID
AND tB.Type = 2