使用LEFT OUTER JOIN
,而不是以WHERE NOT EXISTS (...)
开头的子查询有什么不同?
使用LEFT OUTER JOIN
,而不是以WHERE NOT EXISTS (...)
开头的子查询有什么不同?
不,它们不是一回事,因为在最简单的用例中,它们将返回相同的行集.
LEFT OUTER JOIN
将返回左表中的所有行,包括相关表中存在行和不存在行的位置.WHERE NOT EXISTS()
子查询将只返回不满足关系的行.
但是,如果在WHERE
子句的外键列上执行LEFT OUTER JOIN
并查找IS NULL
,则可以进行与WHERE NOT EXISTS
相同的行为.
SELECT
t_main.*
FROM
t_main
LEFT OUTER JOIN t_related ON t_main.id = t_related.id
/* IS NULL in the WHERE clause */
WHERE t_related.id IS NULL
SELECT
t_main.*
FROM t_main
WHERE
NOT EXISTS (
SELECT t_related.id
FROM t_related
WHERE t_main.id = t_related.id
)
它将返回t_main
中的行,其中t_related
中既有相关行也没有相关行.
SELECT
t_main.*
FROM
t_main
LEFT OUTER JOIN t_related ON t_main.id = t_related.id
/* WHERE clause does not exclude NULL foreign keys */
Note这并不说明查询是如何编译和执行的,这也是不同的--这只解决了它们返回的行集的比较问题.