【发布时间】:2011-05-31 16:09:17
【问题描述】:
我一直在做的是
SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL
基本上,我试图找到没有关联b 的a 行,其中外键存储在b 上。这是执行此操作的正确方法,还是有其他类型的连接来执行此操作?
【问题讨论】:
我一直在做的是
SELECT * FROM a LEFT JOIN b ON b.a_id=a.id WHERE b.id IS NULL
基本上,我试图找到没有关联b 的a 行,其中外键存储在b 上。这是执行此操作的正确方法,还是有其他类型的连接来执行此操作?
【问题讨论】:
您正在寻找NOT EXISTS:
SELECT
*
FROM
a
WHERE
NOT EXISTS (SELECT 1 FROM b WHERE a_id = a.id)
在b.a_id 上建立索引有助于提高此查询的性能。
【讨论】:
b.a_id 上有索引时,这将非常快。
NOT EXISTS 和LEFT JOIN/IS NULL 生成了相同的计划,至少在我输入的特定随机数据下。我只会根据表大小和问题的数据分布的实际测试在这些之间进行选择在眼前。 (例如,MySQL 可能有完全不同的优化。)所有其他条件相同我发现 JOIN 更容易阅读,因为它更短。
是的,这是正常的方式,我不知道更好的方式。
【讨论】:
你可以试试
Select * from a where a.id not in (Select a_id from b)
【讨论】:
select a_id from b),除此之外,如果从子查询返回的值中有NULL,这将失败。
前面的三种反应都是正确的,此时我想你可以考虑一下三种查询的性能。你可以看看这个网址:
http://rockycode.com/blog/not-vs-outer-join-performance/
在我看来,我认为外连接是最好的方式,如果你没有太多的行,这三种方式或多或少是相等的。
【讨论】: