为什么左外连接查询给出的结果与子查询不同?

9udxz4iz  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(387)

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

为什么会有这种区别?

g52tjvyc

g52tjvyc1#

第一个select实际上就像一个内部连接,因为t2的where条件中有非null值。但是,区别仍然来自mem\u ssn不是t2中的主键。
e、 g.如果mem\u ssn的某个特定值在t2中是三倍,则第一个选择给出所有三行,但第二个带有subselect的选择只给出该值一次(如果在t1中只有一次)。

shstlldc

shstlldc2#

你的 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 条款。注意:我假设所有的常量值都是字符串,甚至那些看起来像数字的。如果它们真的是数字,你应该去掉单引号。

相关问题