我对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')
为什么有区别?
答案 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中只有一次)。