一尘不染

使用LEFT OUTER JOIN检查相关行是否不存在的最佳方法是什么

sql

我想使用MySQL 5.x从表X中 高效地 选择所有表,其中表Y中 没有 满足某些条件的 相关行 ,例如

给我所有X记录,其中不存在与foo = bar相关的Y

SELECT count(id) FROM X
LEFT OUTER JOIN Y ON y.X_id = X.id AND y.foo = 'bar'
WHERE y....?

据我了解,保证左外部联接可以为左(第一个)表中的每一行产生一行(在这种情况下为X),无论是否在联接表中找到满意的行。然后,我只想选择未找到任何行的那些行。

在我看来,如果没有匹配的记录,则y.X_id应该为NULL,但是此测试似乎无效。y.X_id = 0或!y.X_id也不是。

编辑 :更正了转录错误(ON而不是AS),该错误已由多个响应指出。修复语法错误。


阅读 227

收藏
2021-03-10

共1个答案

一尘不染

SELECT count(id) FROM X 
LEFT OUTER JOIN Y ON (y.X_id = X.id AND y.foo = 'bar')
WHERE y.X_id is null

你近了。

首先,像往常一样进行连接,然后选择not null实际上在Y中存在一行的所有行null,因此可以确保存在“不匹配”,而不仅仅是nullY中的一个值。

另请注意您在查询中所做的错别字(已更正):

LEFT OUTER JOIN Y AS
-- should be
LEFT OUTER JOIN Y ON
-- This however is allowed
LEFT OUTER JOIN table2 as Y ON ....
2021-03-10