1

以下 SQL 语句:

select * from employees e   
left join departments d on e.deptid = d.deptid   
where ( d.deptname = 'HR' or d.deptname  = 'HR & Accounts')    

产生与以下内连接相同的结果:

select * from employees e  
   inner join departments d on e.deptid = d.deptid and d.deptname like '%HR%';  

它们以何种方式产生相同的结果。

我的意思是第一个查询等价于:

  1. 从员工中选择 * 并使用 where 过滤
  2. 左加入吗?

第一个查询的步骤是什么使其与内部连接相同?

4

2 回答 2

3

对于不符合外连接条件的行,连接表中任何一列的值为NULL。Where 子句(从概念上讲)处理连接之后发生,因此测试这些列的任何条件都将是错误的(或者,严格来说,NULL)。

如果要包含一个表中的所有行,但只匹配第二个表中满足条件的行,则必须将该条件添加到外部联接的 ON 子句中。

另外,请注意,由于内部联接会丢弃不匹配的行,因此内部联接的 ON 子句中的条件与 Where 子句中的条件具有相同的效果。

于 2013-02-16T11:41:19.783 回答
1

使用第二个查询,您可以过滤连接条件。

剩下的第一个查询使用 deptid 将员工连接到部门。它返回所有可能的结果,然后使用您的 where 子句进行过滤。此过滤后本质上会更改查询以返回类似于内部连接查询的结果。

您可以更改第一个查询以显示由于您的 where 子句而无法返回的内容,如下所示:

select *, CASE WHEN d.deptname = 'HR' or d.deptname  = 'HR & Accounts' THEN 1 ELSE 0 END as HR
from employees e 
left join departments d on e.deptid = d.deptid;
于 2013-02-16T11:42:06.323 回答