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

时间:2011-05-04 15:41:02

标签: mysql sql join outer-join

使用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也不是。

编辑:纠正了多个回复指出的转录错误(非AS)。修正了语法错误。

5 个答案:

答案 0 :(得分:19)

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

你很亲密。

首先按正常方式进行连接,然后选择Y中not null行实际为null的所有行,这样您就可以确定“不匹配”,而不仅仅是{{ 1}} Y中的值。

另请注意您在查询中输入的拼写错误(已更正):

null

答案 1 :(得分:4)

检查表Y的主键是否为NULL将执行该操作,这表示连接未匹配:

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

答案 2 :(得分:2)

约翰的回答是正确的100%。

除此之外,还有这个选项:

SELECT count(id)
FROM X 
WHERE NOT EXISTS
  ( SELECT * 
    FROM Y
    WHERE (y.X_id = X.id AND y.foo = 'bar')
  )

根据您的表格大小和数据分布,这可能更有效。测试并保持两种方式以供将来参考。

答案 3 :(得分:-1)

为什么要使用外连接? 你不能这样做:

SELECT count(id) 
FROM X JOIN Y AS y.X_id = X.id AND y.foo <> 'bar'

答案 4 :(得分:-1)

你必须记住 NULL 是特殊值!这就是我mysql doc的原因你有一章名为“4.3.4.6使用NULL值”

链接:  https://dev.mysql.com/doc/refman/5.7/en/working-with-null.html

享受!