Почему левый запрос на внешнее объединение дает разные результаты по сравнению с подзапросом? - PullRequest
0 голосов
/ 27 августа 2018

Я запускаю следующий запрос для 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 голосов
/ 28 августа 2018

Первый выбор действительно работает как внутреннее соединение, так как есть ненулевые значения, где условие для t2.Но, тем не менее, разница заключается в том, что mem_ssn не является первичным ключом в t2.

Например, если конкретное значение mem_ssn трижды в t2, первый выбор дает все три строки, а второй с подвыбором даетэто значение только один раз (если оно только один раз в t1).

0 голосов
/ 27 августа 2018

Ваши 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.Примечание: я предполагаю, что все значения констант являются строками, даже те, которые выглядят как числа.Если они действительно числа, вы должны бросить одинарные кавычки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...