与子查询相比,为啥左外连接查询给出不同的结果?
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 中出现一次)。
【讨论】:
以上是关于与子查询相比,为啥左外连接查询给出不同的结果?的主要内容,如果未能解决你的问题,请参考以下文章