我对db2linux运行以下查询
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条答案
按热度按时间g52tjvyc1#
第一个select实际上就像一个内部连接,因为t2的where条件中有非null值。但是,区别仍然来自mem\u ssn不是t2中的主键。
e、 g.如果mem\u ssn的某个特定值在t2中是三倍,则第一个选择给出所有三行,但第二个带有subselect的选择只给出该值一次(如果在t1中只有一次)。
shstlldc2#
你的
where
条件改变了局面left join
变成一个inner join
. 因此,一些行正在从schemaname.A
因为没有火柴schemaname.B
.把所有条件都放在表格的第二张上
on
条款:第一个表中的条件属于
where
条款。注意:我假设所有的常量值都是字符串,甚至那些看起来像数字的。如果它们真的是数字,你应该去掉单引号。