Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle - Left Outer Join mit Where-Klausel

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