我有两张桌子:
表 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请求?
答案 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
相提并论,并且更紧凑。