与子查询相比,为啥左外连接查询给出不同的结果?

Posted

技术标签:

【中文标题】与子查询相比,为啥左外连接查询给出不同的结果?【英文标题】:Why does a left outer join query gives different results compared to a sub query?与子查询相比,为什么左外连接查询给出不同的结果? 【发布时间】:2018-08-27 01:29:14 【问题描述】:

我对 DB2 linux 运行以下查询

select * from schemaname.A t1 LEFT OUTER JOIN schemaname.B t2 on t1.SSN = t2.mem_ssn
where t2.mem_ssn = t1.ssn
and t2.ind= 'Y'
and t1.ind = 'Y'
and t1.yyyy = '2018'
and t2.yyyy = '2018'
and t1.plan = '1340'

这给出了 143 条记录。

如下查询返回 141 条记录

select * from schemaname.A where ind = 'Y' and yyyy = '2018' and plan = '1340' and ssn in
(select mem_ssn from schemaname.B where yyyy = '2018' and ind = 'Y')

为什么会有这种差异?

【问题讨论】:

【参考方案1】:

您的where 条件将left join 转换为inner join。因此,schemaname.A 中的某些行被过滤掉了,因为没有匹配 schemaname.B

所有条件放在on子句中的第二个表上:

select *
from schemaname.A t1 LEFT OUTER JOIN
     schemaname.B t2
     on t1.SSN = t2.mem_ssn and
        t2.mem_ssn = t1.ssn and
        t2.ind = 'Y' and
        t2.yyyy = '2018'
where t1.ind = 'Y' and
      t1.yyyy = '2018'
      t1.plan = '1340';

第一个表的条件属于where 子句。注意:我假设所有的常量值都是字符串,即使是那些看起来像数字的。如果它们确实是数字,则应去掉单引号。

【讨论】:

【参考方案2】:

第一个选择实际上就像一个内部连接,因为 t2 的 where 条件中有非空值。 但是,差异仍然来自 mem_ssn 不是 t2 中的主键。

例如如果 mem_ssn 的特定值在 t2 中是 3 次,则第一个选择会给出所有三行,但第二个带有子选择的选择仅给出该值一次(如果它仅在 t1 中出现一次)。

【讨论】:

以上是关于与子查询相比,为啥左外连接查询给出不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章

左外连接没有给出任何结果

SQL 查询时间复杂度 - 连接与子查询

netezza 左外连接查询性能

左外连接,最终查询没有结果

Hive SQL 多个左外连接查询在其结果中缺少记录

分页结果集中的选择子查询或左外连接哪个更快