Giải thích của bạn không tương quan với truy vấn của bạn. Bạn đã đề cập
" Tuy nhiên, tôi cũng cần bao gồm mệnh đề where nhưng .... Tôi vẫn muốn một hàng từ bảng bên trái được trả về cho mỗi bản ghi trong bảng bên trái ngay cả khi điều kiện trong mệnh đề where là không. 'không gặp. "
Vì vậy, tôi tin rằng truy vấn của bạn trông giống như thế này
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
Ở trên, LEFT OUTER JOIN
sẽ được chuyển đổi thành INNER JOIN
do việc lọc bảng bên phải trong Where
mệnh đề
Vì vậy, như bạn đã sử dụng trong truy vấn đầu tiên, các bộ lọc bảng bên phải phải là một phần của JOIN
điều kiện, sẽ trả về các hàng từ bảng TRÁI mặc dù không có bản ghi nào phù hợp trong bảng bên RIGHT.
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
Cập nhật:
Bạn đã sử dụng giữa toán tử như 10 between 11 and 9
nhưng nó phải là 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