簡體   English   中英

SQL連接具有特定條件的兩個表

[英]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。

一個SQLfiddle來測試兩者並看到差異

嘗試

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM