this candidate answer中,有人断言,在涉及WHERE个子句的某些情况下,JOINLEFT JOIN好,因为它不会混淆查询计划器,也不是"无意义的".断言/假设是,这对任何人来说都应该是显而易见的.

请进一步解释或提供链接供进一步阅读.

推荐答案

考虑下面的例子.我们有两张桌子,部门和员工.

一些部门还没有员工.

此查询使用一个内部联接来查找999员工所在的部门(如果有),否则将不显示任何内容(甚至不显示员工或其姓名):

select a.department_id, a.department_desc, b.employee_id, b.employee_name
  from departments a
  join employees b
    on a.department_id = b.department_id
 where b.employee_id = '999'

下一个查询使用外部联接(位于部门和员工之间),并查找员工999工作的部门.但是,如果员工不在任何部门工作,它也不会显示员工的ID或姓名.这是因为WHERE子句中使用了外部联接表.如果没有匹配的部门,它将为空(不是999,即使员工中存在999).

select a.department_id, a.department_desc, b.employee_id, b.employee_name
  from departments a
  left join employees b
    on a.department_id = b.department_id
 where b.employee_id = '999'

但是考虑一下这个问题:

select a.department_id, a.department_desc, b.employee_id, b.employee_name
  from departments a
  left join employees b
    on a.department_id = b.department_id
   and b.employee_id= '999'

现在标准在on条款中.因此,即使该员工不在任何部门工作,他仍然会被退回(他的ID和姓名).部门列将为空,但我们会得到一个结果(员工端).

您可能认为永远不会希望在WHERE子句中使用外部联接表,但情况并非如此.但出于上述原因,通常情况下是这样的.

假设您希望所有部门都没有员工.然后,您可以运行以下操作,它确实使用了外部联接,并且外部联接表在where子句中使用:

select a.department_id, a.department_desc, b.employee_id
  from departments a
  left join employees b
    on a.department_id = b.department_id
 where b.employee_id is null

^^显示没有员工的部门.

以上可能是您希望在WHERE子句中使用外部联接表而不是ON子句(我认为这就是您的问题所在;内部联接和外部联接之间的区别是一个完全不同的主题)的唯一合理原因.

一个很好的方法是:使用外部联接来允许空值.那么,为什么要使用外部联接,并说字段不应该为null,应该等于'XYZ'?如果一个值必须是"XYZ"(非null),那么为什么要指示数据库允许null返回呢?这就像说了一件事,后来又推翻了它.

Postgresql相关问答推荐

Trunc函数不删除小数

PostgreSQL按描述请求

是否从表中 Select 值?巴什

GORM Golang SQL查询执行不区分大小写的搜索不起作用

无法在kubernetes中设置postgres复制

使用 OpenCypher 和 Apache AGE 在两个顶点之间创建双向关系

如何在 postgres 中查询键设置为空值的 jsonb 字段

如何将两条线几何连接成一条记录?

如何让 Flask SQLAlchemy 重用数据库连接?

使用 ON CONFLICT 从 INSERT 返回行,无需更新

在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段

Select 空字段

在函数中返回字段作为插入结果

是否有为 SQL Server 生成完整数据库 DDL 的工具? Postgres 和 MySQL 呢?

IntegrityError:postgres 从转储恢复后,所有具有 ForeignKey 的模型/字段的id列中的空值

PostgreSQL:如何安装 plpythonu 扩展

理解 Postgres 行大小

设置 Phoenix 框架和 Ecto 以使用 UUID:如何插入生成的值?

如何将 PostgreSQL 查询输出导出到 csv 文件

Array Push的 Postgres 数组追加和数组长度