Ihre Erklärung stimmt nicht mit Ihrer Anfrage überein. Sie haben
erwähnt"Allerdings muss ich auch eine where-Klausel einfügen, aber.... Ich möchte immer noch, dass eine Zeile aus der linken Tabelle für jeden Datensatz in der linken Tabelle zurückgegeben wird, selbst wenn die Bedingung in der where-Klausel n ist nicht erfüllt. "
Ich glaube also, dass Ihre Abfrage in etwa so aussieht
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
Oben der LEFT OUTER JOIN
wird in INNER JOIN
umgewandelt aufgrund der Filterung der rechten Tabelle in Where
Klausel
Wie Sie also in der ersten Abfrage verwendet haben, sollten die richtigen Tabellenfilter Teil von JOIN
sein Bedingung, die Zeilen aus der LINKEN Tabelle zurückgibt, obwohl es keine übereinstimmenden Datensätze in der RECHTEN Seitentabelle gibt.
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
Aktualisieren :
Sie haben zwischen Operatoren wie 10 between 11 and 9
verwendet aber es sollte 10 between 9 and 11
sein
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