使用SQL WHERE或JOIN“排除”结果?

时间:2015-05-16 12:25:31

标签: mysql sql

我有一个查询,我想添加一些日志,以便在我向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

上加入

谢谢!

4 个答案:

答案 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
)