我有一个查询,我想添加一些日志,以便在我向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
上加入谢谢!
答案 0 :(得分:2)
标准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)
答案 1 :(得分:0)
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 )
答案 2 :(得分:0)
正确加入比 RDBMS 中的子查询更快。这Join vs. sub-query更多地解释了这一点。使用以下查询:
SELECT blah blah
FROM donation
LEFT JOIN donation_relation
ON donation.id = donation_relation.donation_id
WHERE donation_relation.donation_id IS NULL
答案 3 :(得分:0)
您可以使用NOT EXISTS
(反加入):
SELECT blah blah FROM donation
WHERE NOT EXISTS (
SELECT 1 FROM donation_relation
WHERE donation_relation.donation_id = donation.id
)