[英]SQL join two tables with specific condition
表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
但上面的查詢會輸出:
即,刪除了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;
考慮一下這樣的結果:
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,但它不是真的),所以這個記錄從最終結果中被消除。
每當您離開加入時,您必須在連接條件中應用要應用於左表的任何過濾條件而不是在哪里,否則您實際上將其轉換為內連接。
如果使用Where
語句進行過濾,則會將連接視為inner join
。
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;
這將執行相同的操作,但包括僅存在於TableA中的行為NULL。
嘗試
SELECT tA.RecordID, tB.Text
FROM [TableA] AS tA
LEFT JOIN [TableB] AS tB
ON tA.RelationID = tB.TableARelationID
AND tB.Type = 2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.