考虑以下示例。我们有两张表,DEPARTMENTS 和 EMPLOYEES。
有些部门还没有员工。
此查询使用内部联接来查找部门员工 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 子句中使用外部联接表的唯一正当理由(我认为这是您的问题;内部联接和外部联接之间的区别是完全不同的主题)。
查看的一个好方法是:您使用外连接来允许空值。为什么你会使用外连接并说一个字段不应该为空并且应该等于'XYZ'?如果一个值必须是“XYZ”(不是空值),那么为什么要指示数据库允许空值返回呢?这就像说一件事,然后再覆盖它。