sql >> Base de Datos >  >> RDS >> Oracle

Oracle:combinación externa izquierda con cláusula where

Su explicación no se corresponde con su consulta. Has mencionado

"Sin embargo, también necesito incluir una cláusula where pero... Todavía quiero que se devuelva una fila de la tabla de la izquierda para cada registro en la tabla de la izquierda, incluso si la condición en la cláusula where es no cumplido. "

Así que creo que su consulta se parece a esto

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 

En lo anterior, LEFT OUTER JOIN se convertirá en INNER JOIN debido a la filtración de la tabla derecha en Where cláusula

Entonces, como usó en la primera consulta, los filtros de tabla correctos deben ser parte de JOIN condición, que devolverá filas de la tabla IZQUIERDA aunque no haya registros coincidentes en la tabla del lado DERECHO.

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 

Actualización:

Ha utilizado entre operadores como 10 between 11 and 9 pero debería ser 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