簡體   English   中英

SQL連接:選擇第二個表中不匹配的行

[英]SQL Join: Select rows with no match in second table

我試圖聯接兩個表,盡管表B中沒有匹配的記錄,但仍從表A中獲取結果。我認為where子句引起了問題,但我似乎無法解決。

SELECT a.id, a.title, a.validation, b.data 
FROM client_option_detail AS a LEFT OUTER JOIN client_data AS b 
ON a.id = b.client_option_detail_id 
WHERE a.client_option_id = ?
AND (b.client_id IS NULL OR b.client_id = ?)

更新:數據庫布局

client_option       client_option_detail 
-------------       ------------------- 
id                  id
                    title
                    validation          
                    client_option_id


client          client_data
-------         ------------ 
id              client_id
                client_option_detail_id             
                data

數據庫樣本:

client_option       client_option_detail 
-------------      ------------------------------------------- 
id                  id | title | validation | client_option_id
-------------      -------------------------------------------
1                  1   | test1 |            | 1  
2                  2   | test2 |            | 1                               
                   3   | test3 |            | 1
                   4   | test4 |            | 2


client              client_data (primary key - client_id + client_option_detail_id)
--------            ------------------------------------------- 
 id                 client_id | client_option_detail_id | data
--------            -------------------------------------------
 1                  1         | 1                       | data1
 2                  1         | 2                       | data2
                    1         | 4                       | data3
                    2         | 3                       | data4
                    2         | 1                       | data5

示例查詢:

SELECT a.id, a.title, a.validation, b.data 
FROM client_option_detail AS a LEFT OUTER JOIN client_data AS b 
ON a.id = b.client_option_detail_id 
WHERE a.client_option_id = 1
AND (b.client_id IS NULL OR b.client_id = 1)

所需的輸出:

    ------------------------------------------- 
     id | title | validation | data
    -------------------------------------------
     1  | test1 |            | data1                                 
     2  | test2 |            | data2
     3  | test3 |            | 
SELECT client_option_detail.id, title, validation, data 
FROM client_option_detail LEFT OUTER JOIN client_data 
ON client_option_detail.id = client_data.client_option_detail_id 

應該很好。 我認為您的病情有問題。
例如:client_option_detail.client_option_id =嗎? ,? 是否包含client_option_detail中的所有ID?

您不需要AND (b.client_id IS NULL OR b.client_id = ?)

SELECT a.id, a.title, a.validation, b.data 
FROM client_option_detail AS a 
LEFT JOIN client_data AS b 
ON a.id = b.client_option_detail_id 
WHERE a.client_option_id = ?

輸出將是這樣的:

id     title     validation     data
1      foo       bar            sample_data1
2      apple     oranges        null
3      try       it             sample_data2

像示例輸出編號2中一樣,如果表B中的數據不匹配,則數據將為空,並且表A中的信息仍將顯示

同樣,如果您確實想根據B中指定的client_id進行過濾,則只需將或放在最后部分(如下所示)即可。 這意味着如果數據包含來自B的指定client_id或具有來自A的指定client_option_id的數據,則將對其進行檢索。

SELECT a.id, a.title, a.validation, b.data 
FROM client_option_detail AS a 
LEFT JOIN client_data AS b 
ON a.id = b.client_option_detail_id 
WHERE a.client_option_id = ? OR b.client_id = ?

有關更多信息,您可能需要看一下這篇文章

更新:

請嘗試以下代碼進行更新:

SELECT a.id, a.title, a.validation, b.data 
FROM client_option_detail AS a 
LEFT JOIN client_data AS b 
ON a.id = b.client_option_detail_id AND b.client_id = a.client_option_id
WHERE a.client_option_id = 1

或這個,我不知道哪個是對的,哪個是最適合您的需求,但是根據您的樣本數據,兩者都會產生相同的結果:

SELECT a.id, a.title, a.validation, b.data 
FROM client_option_detail AS a 
LEFT JOIN client_data AS b 
ON a.id = b.client_option_detail_id AND b.client_id = 1
WHERE a.client_option_id = 1

嘗試使用SQLize:

在此處輸入圖片說明

我希望這次我做對了。 祝好運

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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