Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle - junção externa esquerda com cláusula where


Sua explicação não se correlaciona com sua consulta. Você mencionou

"No entanto, também preciso incluir uma cláusula where, mas... ainda quero que uma linha da tabela à esquerda seja retornada para cada registro na tabela à esquerda, mesmo que a condição na cláusula where seja não atendido. "

Então, acredito que sua consulta seja algo assim
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 

Acima, o LEFT OUTER JOIN será convertido em INNER JOIN devido à filtragem da tabela direita em Where cláusula

Então, como você usou na primeira consulta, os filtros de tabela corretos devem fazer parte de JOIN condição, que retornará linhas da tabela ESQUERDA mesmo que não haja registros correspondentes na tabela lateral DIREITA.
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 

Atualizar:

Você usou entre o operador como 10 between 11 and 9 mas deve 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