Как вы, наверное, поняли, left join
сохраняет все элементы из таблицы сохраненных рядов (сотрудник), тогда как ваш where
отфильтровывает эти элементы, если a.joindate<b.joindate or a.releasedate >= b.releasedate
.
Эти on
условия логически интерпретируются как:
- Для каждого элемента
li
из левой таблицы, всякий раз, когда элемент ri
из правой таблицы найдено соответствие условиям on
, создайте новый элемент ni
, значения столбцов которого представляют собой комбинацию li
и ri
. Затем поместите ni
в набор результатов. Это может дублировать строки из левой таблицы. - Если
li
не удается найти соответствие, сделайте одну его копию, заполните правые столбцы нулями. Поместите этот элемент также в набор результатов.
Таким образом, мы можем эмулировать это поведение следующим образом:
- Ослабьте условия
on
, сохраняя только условия равенства в предложении on
; - Отфильтровывать дополнительные строки, вызванные ослабленными условиями
on
, т. е. строки, которые не удовлетворяют условиям, отличным от условий равенства.
Результирующий запрос может выглядеть так:
select
a.id,
b.name
from employee a
left outer join company b
on (a.id=b.id)
where (b.id is null
or (a.joindate>=b.joindate and a.releasedate<b.releasedate))