Có vẻ như những gì bạn thực sự muốn là tham gia INNER. Thả dấu (+) và xem liệu bạn có lấy lại được những gì mình đang tìm kiếm hay không. Ngoài ra, @GordonLinoff đưa ra một gợi ý tuyệt vời - hãy thoải mái với việc sử dụng cú pháp nối ANSI, cú pháp vừa diễn đạt vừa dễ hiểu hơn kiểu cũ "đặt tất cả các điều kiện trong mệnh đề WHERE rồi cố gắng giải đáp" .
Đây là cách tôi viết lại truy vấn này bằng cú pháp nối chuẩn ANSI:
SELECT *
FROM PER_ALL_ASSIGNMENTS_F paaf
INNER JOIN PAY_ALL_PAYROLLS_F payr
ON payr.PAYROLL_ID = paaf.PAYROLL_ID
WHERE SYSDATE BETWEEN paaf.EFFECTIVE_START_DATE
AND paaf.EFFECTIVE_END_DATE AND
paaf.ASSIGNMENT_TYPE IN ('E', 'C') AND
paaf.PRIMARY_FLAG = 'Y' AND
payr.ATTRIBUTE1 = 'TINT' AND
paaf.EFFECTIVE_START_DATE BETWEEN NVL(payr.EFFECTIVE_START_DATE, TO_DATE('01/01/1000', 'DD/MM/YYYY'))
AND NVL(payr.EFFECTIVE_END_DATE, TO_DATE('31/12/4712', 'DD/MM/YYYY'))
Một vấn đề nhỏ khác. Tôi nhận thấy bạn đang sử dụng GIỮA với các giá trị ngày có thể có vấn đề. Ví dụ:giả sử bạn có EFFECTIVE_START_DATE 01-JAN-2013 và EFFECTIVE_END_DATE 30-JUN-2013 trên một số hàng trong PER_ALL_ASSIGNMENTS_F và giả sử thêm rằng ngày và giờ hiện tại là 30-JUN-2013 lúc 07:02:04 sáng. Với các giá trị dữ liệu này, hàng này từ PER_ALL_ASSIGNMENTS_F sẽ KHÔNG được chọn, mặc dù bạn có thể mong đợi nó được. Vấn đề là khi các trường duy nhất được điền vào giá trị DATE là ngày, tháng và năm, thì giờ, phút và giây được mặc định bằng 0 - do đó, ngày kết thúc thực sự là Ngày 30 tháng 6 năm 2013 lúc 00:00:00, trước ngày / giờ hiện tại của ngày 30 tháng 6 năm 2013 lúc 07:02:04 sáng và do đó, việc so sánh ngày khiến hàng bị bỏ qua. Tôi không biết cách các trường EFFECTIVE_END_DATE được điền vào cơ sở dữ liệu của bạn - hy vọng chúng được điền đầy đủ, ví dụ:30-JUN-2013 23:59:59 - nhưng nếu không, bạn có thể cần so sánh ngày tháng của mình như
TRUNC(SYSDATE) BETWEEN paaf.EFFECTIVE_START_DATE
AND paaf.EFFECTIVE_END_DATE
hoặc
SYSDATE BETWEEN paaf.EFFECTIVE_START_DATE
AND paaf.EFFECTIVE_END_DATE + INTERVAL '1' DAY - INTERVAL '1' SECOND
(Biểu mẫu trước có lẽ là lựa chọn tốt hơn, vì biểu mẫu sau sẽ loại trừ việc sử dụng bất kỳ chỉ mục không dựa trên chức năng nào có thể tồn tại trên tồn tại vào (EFFECTIVE_START_DATE, EFFECTIVE_END_DATE).
Chia sẻ và tận hưởng.