如果右表匹配,则排除记录

时间:2015-10-20 14:13:49

标签: mysql sql

我有两张桌子:

A

+--+----+
|id|name|
+--+----+
|0 |foo |
|1 |bar |
|2 |baz |
+-------+

B

+--+----+
|A |cond|
+--+----+
|0 |X   |
|1 |Y   |
+-------+

B.A列是A.id值。

当B.cond =' X'。

时,我想从 A 中选择 B 表格中没有匹配项的所有行

所以,结果应该是:

  • 巴兹

如何使用join(或类似的性能方法)编写此SQL请求?

3 个答案:

答案 0 :(得分:5)

您可以使用NOT EXISTS

SELECT a.id, a.name
FROM A
WHERE NOT EXISTS
(
    SELECT 1 FROM B
    WHERE b.A = a.id AND b.cond = 'X'
)

但是,我总是忘记MySql是唯一(?)rdbms,它在优化EXISTS / NOT EXISTS方面存在问题。因此,使用LEFT JOIN方法效率稍高。

http://explainextended.com/2009/09/18/not-in-vs-not-exists-vs-left-join-is-null-mysql/

在MS SQL-Server中,最好使用NOT EXISTS

http://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join

答案 1 :(得分:2)

SELECT
  A.*
FROM
  A
LEFT JOIN
  B
  ON A.id = B.A
  AND B.cond = 'X'
WHERE
  B.A IS NULL

此查询根据您指定的条件加入表,然后仅选择表B中不匹配的行。

答案 2 :(得分:1)

除了提议的解决方案之外,使用not in也会起作用:

SELECT * FROM A
WHERE ID NOT IN (SELECT A FROM B WHERE COND = 'X')

它应该与left join相提并论,并且更紧凑。