[英]SQL join tables but exclude duplicates where all columns match except 1
[英]“Exclude” results with an SQL WHERE or JOIN?
我有一個查詢,我想向其中添加一些日志,以刪除在向JOIN中添加一個表時成功匹配的結果。
我現在通過附加的WHERE IN語句來完成此操作:
SELECT blah blah FROM donation
WHERE donation.id NOT IN (SELECT donation_id FROM donation_relation)
我只是擔心,當表開始增長時,從子查詢中的donation_relation表中選擇所有ID字段將開始拖動。 使用JOIN進行此排除的更有效方法(如果存在)是什么? 這兩個表可以在donation.id和donation_relation.donation_id上聯接
謝謝!
標准SQL中的常用方法使用相關的NOT EXISTS(另外,當涉及NULL時,NOT IN可能會產生一些非直觀的副作用):
SELECT blah blah FROM donation as d
WHERE NOT EXISTS
(SELECT * FROM donation_relation as dr
where dr.donation_id = d.donation_id)
LEFT OUTER JOIN
替代:
SELECT blah blah
FROM donation
LEFT JOIN donation_relation ON donation.id = donation_relation.donation_id
WHERE donation_relation.donation_id IS NULL;
可能更快,尤其是在使用MySQL時。
EXISTS
版本:
SELECT blah blah FROM donation
WHERE NOT EXISTS (SELECT donation_id FROM donation_relation
WHERE donation.id = donation_relation.donation_id )
確實,JOIN比RDBMS中的子查詢要快。 此Join vs.子查詢對此有更多解釋。 使用以下查詢:
SELECT blah blah
FROM donation
LEFT JOIN donation_relation
ON donation.id = donation_relation.donation_id
WHERE donation_relation.donation_id IS NULL
您可以使用NOT EXISTS
(反NOT EXISTS
):
SELECT blah blah FROM donation
WHERE NOT EXISTS (
SELECT 1 FROM donation_relation
WHERE donation_relation.donation_id = donation.id
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.