在this candidate answer中,有人断言,在涉及WHERE
个子句的某些情况下,JOIN
比LEFT JOIN
好,因为它不会混淆查询计划器,也不是"无意义的".断言/假设是,这对任何人来说都应该是显而易见的.
请进一步解释或提供链接供进一步阅读.
在this candidate answer中,有人断言,在涉及WHERE
个子句的某些情况下,JOIN
比LEFT 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返回呢?这就像说了一件事,后来又推翻了它.