为什么左外部联接查询与子查询相比给出不同的结果?

时间:2018-08-27 01:29:14

标签: mysql sql database db2

我对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')

为什么有区别?

2 个答案:

答案 0 :(得分:3)

您的where条件将left join变成inner join。因此,由于没有匹配项schemaname.A,正在从schemaname.B中过滤掉某些行。

on子句的第二个表上

放置 all 个条件:

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子句。注意:我假设所有常量值都是字符串,即使那些看起来像数字的常量也是如此。如果它们确实是数字,则应删除单引号。

答案 1 :(得分:1)

第一个选择的确像内部联接一样工作,因为t2的where条件中存在非空值。 但是,区别仍然在于mem_ssn不是t2中的主键。

例如如果mem_ssn的特定值在t2中是三倍,则第一个选择给出所有三行,而第二个与subselect给出该值仅一次(如果在t1中只有一次)。