Вашето обяснение не корелира с вашето запитване. Вие споменахте
„Трябва обаче да включа и клауза where, но... Все още искам ред от лявата таблица да бъде върнат за всеки запис в лявата таблица, дори ако условието в клаузата where не е не съм срещал. "
Така че смятам, че вашето запитване изглежда нещо подобно
SELECT a.*,
b.*
FROM a
LEFT OUTER JOIN b
ON a.vin = b.vin
WHERE Trunc(a.rep_open_date) BETWEEN Trunc(b.check_in_date) + 1 AND
Trunc(b.check_in_date) - 1
В горното LEFT OUTER JOIN
ще се преобразува в INNER JOIN
поради филтрирането на дясната таблица в Where
клауза
Така че, както сте използвали в първата заявка, правилните филтри за таблица трябва да са част от JOIN
условие, което ще върне редове от ЛЯВАТА таблица, въпреки че няма съответстващи записи в ДЯСНАТА таблица.
SELECT a.*,
b.*
FROM a
left outer join b
ON a.vin = b.vin
AND Trunc(a.rep_open_date) BETWEEN
Trunc(b.check_in_date) + 1 AND
Trunc(b.check_in_date) - 1
Актуализация:
Използвали сте оператор между като 10 between 11 and 9
но трябва да е 10 between 9 and 11
SELECT a.*,
b.*
FROM a
left outer join b
ON a.vin = b.vin
AND CAST(a.rep_open_date as date) BETWEEN
CAST(b.check_in_date as date) - 1 AND
CAST(b.check_in_date as date) + 1