Объединение против ИЛИ возвращает другой набор результатов - PullRequest
0 голосов
/ 16 октября 2019

У меня есть два запроса, чтобы получить строки на основе EFFDT. Один использует объединение двух условий даты, другой - оператор ИЛИ. Объединение скучает по двум людям, которые производит ИЛИ. Почему?

Я играл с порядком объединяемых аргументов, если он обратный, он пропускает одну строку (другого сотрудника), чем текущий порядок.

- Настройка объединения:

select *
from (select distinct JOB.EMPLID, JOB.EMPL_RCD, JOB.EFFDT
      from JOB JOB
     where JOB.EMPL_STATUS in ('A',
                               'P',
                               'L')
       and JOB.EFFDT =
           COALESCE((select min(JOB_ED2.EFFDT)
                      from PS_JOB JOB_ED2
                     where JOB_ED2.EMPLID = JOB.EMPLID
                       and JOB_ED2.EMPL_RCD = JOB.EMPL_RCD
                       and JOB_ED2.EFFDT > '01-JUL-2018'),
                    (select max(JOB_ED.EFFDT)
                       from PS_JOB JOB_ED
                      where JOB_ED.EMPLID = JOB.EMPLID
                        and JOB_ED.EMPL_RCD = JOB.EMPL_RCD
                        and JOB_ED.EFFDT <= '01-JUL-2018')) --two
       and JOB.EFFSEQ = (select max(JOB_ES.EFFSEQ)
                           from PS_JOB JOB_ES
                          where JOB_ES.EMPLID = JOB.EMPLID
                            and JOB_ES.EMPL_RCD = JOB.EMPL_RCD
                            and JOB_ES.EFFDT = JOB.EFFDT)

ИЛИ:

 (select distinct JOB.EMPLID as EMP2_ID, JOB.EMPL_RCD

from PS_JOB JOB
where JOB.EMPL_STATUS in ('A',
                         'L',
                         'P')
 and (JOB.EFFDT = (select max(JOB_ED.EFFDT)
                     from PS_JOB JOB_ED
                    where JOB_ED.EMPLID = JOB.EMPLID
                      and JOB_ED.EMPL_RCD = JOB.EMPL_RCD
                      and JOB_ED.EFFDT <= '01-JUL-2018') or
     (JOB.EFFDT > '01-JUL-2018'))
 and JOB.EFFSEQ = (select max(JOB_ES.EFFSEQ)
                     from PS_JOB JOB_ES
                    where JOB_ES.EMPLID = JOB.EMPLID
                      and JOB_ES.EMPL_RCD = JOB.EMPL_RCD
                      and JOB_ES.EFFDT = JOB.EFFDT))

Я ожидаю, что объединение вернет тот же набор, что и ИЛИ, только с правильнымдаты, но он пропускает эти строки, и мне просто интересно, почему он не собирает их. Возможно, я закрыл скобки, так как это фрагменты кода, поэтому, пожалуйста, по возможности избавьтесь от синтаксического анализа.

1 Ответ

0 голосов
/ 16 октября 2019

В вашей ИЛИ версии вы принимаете любую JOB.EFFDT> '01 -JUL-2018 '.

В вашей COALESCE версии, где JOB.EFFDT> '01 -JUL-2018 'вы принимаете только JOB.EFFDT = min (JOB_ED2.EFFDT).

Понятно, если два параметра COALESCE отличаются от двух слагаемых в сочетании с OR, это неУдивительно, если результаты отличаются.

COALESCE отдает приоритет результатам слева направо (поэтому перестановка аргументов дает другой результат), ИЛИ не имеет приоритета.

...