SQL使用特定条件连接两个表
表A结构: 表B结构: 上面是两个表,TableB.TableARelationID是用于映射表a的关系ID 期望输出: 期望的结果是采用TableA.RecordID和TableB.Text,但仅采用表B中的类型2,即忽略类型1 下面是我使用的SQL查询:SQL使用特定条件连接两个表,sql,select,join,left-join,where-clause,Sql,Select,Join,Left Join,Where Clause,表A结构: 表B结构: 上面是两个表,TableB.TableARelationID是用于映射表a的关系ID 期望输出: 期望的结果是采用TableA.RecordID和TableB.Text,但仅采用表B中的类型2,即忽略类型1 下面是我使用的SQL查询: SELECT tablea.recordid, tableb.text FROM tablea LEFT JOIN tableb ON tablea.relation
SELECT tablea.recordid,
tableb.text
FROM tablea
LEFT JOIN tableb
ON tablea.relationid = tableb.tablearelationid
WHERE type = 2
但上述查询将输出:
i、 e.由于过滤了“where”子句,RecordID 1丢失
那么如何显示表A中的RecordID 1呢?您需要将
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
然后在type列上进行筛选,因此对于recordID=1,您的whereNULL=2
为false(它实际上不是false,它是NULL,但它不是true),因此此记录将从最终结果中删除
无论何时离开join,都必须在join条件(而不是where)中将任何要应用于左表的筛选条件应用于左表,否则将有效地将其转化为内部联接。如果使用
where
语句进行筛选,则联接将被视为内部联接
select
TableA.RecordID
, TableB.Text
from
TableA
left join TableB on TableA.RelationID = TableB.TableARelationID AND TableB.Type = 2
试试这个
select TableA.RecordID, TableB.Text
from TableA
left join TableB on
TableA.RelationID = TableB.TableARelationID AND
TableB.Type = 2
您应该使用TableB.Type=2
select TableA.RecordID, TableB.Text
from TableA,
TableB
where TableA.RelationID = TableB.TableARelationID
and TableB.Type = 2
在LEFT JOIN
条件中添加Type=2
条件
试试这个:
SELECT A.RecordID, B.Text
FROM TableA A
LEFT JOIN TableB B ON A.RelationID = B.TableARelationID AND B.Type = 2
此查询有两个直接版本
SELECT recordid, CASE WHEN type=2 THEN text ELSE NULL END text
FROM tableA
JOIN tableB
ON tableA.relationid = tableB.tablearelationid;
这将为类型2显示NULL,并且不包括两个表中不存在的行
SELECT recordid, text
FROM tableA
LEFT JOIN tableB
ON tableA.relationid = tableB.tablearelationid AND type=2;
这将执行相同的操作,但包括仅以NULL形式存在于TableA中的行
.试试看
SELECT tA.RecordID, tB.Text
FROM [TableA] AS tA
LEFT JOIN [TableB] AS tB
ON tA.RelationID = tB.TableARelationID
AND tB.Type = 2