У меня есть два запроса, чтобы получить строки на основе 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))
Я ожидаю, что объединение вернет тот же набор, что и ИЛИ, только с правильнымдаты, но он пропускает эти строки, и мне просто интересно, почему он не собирает их. Возможно, я закрыл скобки, так как это фрагменты кода, поэтому, пожалуйста, по возможности избавьтесь от синтаксического анализа.