[英]Select rows not in another table
SELECT DISTINCT a.value
FROM a LEFT JOIN b
ON a.value = b.value
AND (b.field IS NULL OR b.field != 'my_string');
SELECT a.value
FROM a
WHERE a.value NOT IN
(SELECT value
FROM b
WHERE b.field = 'my_string');
根据我的阅读,进行左联接更快。 但是我也读过DISTINCT是低效率查询的代码味道。 在最坏的情况下,如何确定哪个查询的性能更好?
编辑:对不起,id不是主键,它只是另一个字段。 我将其替换为价值。
EDIT2:好像每个人都挂断了我的第一个查询。 假设它看起来像这样。 逻辑不一样吗?
SELECT DISTINCT a.value
FROM a LEFT JOIN b ON a.value = b.value
WHERE (b.field IS NULL OR b.field != 'my_string');
EDIT3:样本小提琴。 http://sqlfiddle.com/#!2/500ea/1
EDIT4:接受的答案。 http://sqlfiddle.com/#!2/500ea/8
您的第一次加入是荒谬的。 它返回所有a.id
中值a
。 请记住, left join
将所有行保留在第一个表中,并将匹配的行保留在第二个表中。 我认为您打算:
SELECT a.id
FROM a LEFT JOIN
b
ON a.id = b.id AND b.field = 'my_string'
WHERE b.field IS NULL;
假设a.id
是唯一的ID,则该distinct
是不必要的。
一种替代方法是使用not exists
:
SELECT a.id
FROM a
WHERE NOT EXISTS (SELECT 1 FROM b WHERE a.id = b.id AND b.field = 'my_string');
为了提高性能,请在b(id, field)
上创建一个索引。
通常, NOT IN (SELECT ...)
比LEFT JOIN
效率更高,因为IN()
条件中的SELECT
必须为每行执行一次才能执行过滤器。 对于小型数据集,这不是问题,但是对于大型数据集,这可能是
一个很大的麻烦,
而且效率很低。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.