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