Twoje wyjaśnienie nie jest skorelowane z zapytaniem. Wspomniałeś
"Jednak muszę również dołączyć klauzulę where, ale.... Nadal chcę, aby wiersz z tabeli po lewej stronie był zwracany dla każdego rekordu w tabeli po lewej stronie, nawet jeśli warunek w klauzuli WHERE jest nie spełnione. "
Uważam więc, że Twoje zapytanie wygląda mniej więcej tak
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
W powyższym LEFT OUTER JOIN
zostanie przekonwertowany na INNER JOIN
ze względu na filtrację właściwej tabeli w Where
klauzula
Tak jak użyłeś w pierwszym zapytaniu, odpowiednie filtry tabeli powinny być częścią JOIN
warunek, który zwróci wiersze z LEWEJ tabeli, nawet jeśli nie ma pasujących rekordów w PRAWEJ tabeli.
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
Aktualizacja:
Użyłeś operatora między, jak 10 between 11 and 9
ale powinno być 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