使用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
  )

But this one is not equivalent:

它将返回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这并不说明查询是如何编译和执行的,这也是不同的--这只解决了它们返回的行集的比较问题.

Database相关问答推荐

Kusto:从一个表中复制行并追加到同一集群中的另一个表中

如何将初始数据放入数据库

如何使用actors进行数据库访问和DDD?

Oracle SQL 开发人员中的 DB2 数据库

在 SQL Server 2008 R2 中,如何强制一列对于整个表是唯一的?

类似 Hibernate 的 C++ 框架

执行次数最多的存储过程?

某些网站不允许在密码中使用句点是否有原因?

如何从表列中删除唯一约束?

JavaScript 布尔搜索查询生成器接口库?

Tornado 的非阻塞 ORM?

Android 在用户之间同步数据

数据库 - 设计 Events事件表

为 PHPMyadmin DB 自动生成数据库图?

如何处理数据库中用户的身份验证/授权?

在 PostgreSQL 中索引空值

用 SQL 进行条件插入?

如何解析来自 Google 快讯的数据?

Data Mapper 是不是比 Active Record 更现代的趋势

如何在数据库中表示树状 struct