首页 文章

如果使用where子句,外连接将提供与内连接相同的结果

提问于
浏览
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%';

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

我的意思是第一个查询等效,例如的:

  • 从员工中选择*并使用where过滤

  • 离开加入?

第一个查询的哪些步骤使其与内部联接相同?

2 回答

  • 3

    使用第二个查询,您可以在连接条件中进行过滤 .

    第一个查询将使用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;
    
  • 1

    对于与外部联接的条件不匹配的行,联接表中任何列的值都为NULL . Where子句在处理连接后发生(概念上),因此测试这些列的任何条件都将为false(或严格地说,为NULL) .

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

    另请注意,因为内部联接会丢弃没有匹配的行,所以内部联接的ON子句中的条件与在Where子句中的条件具有相同的效果 .

相关问题