Kedengarannya seperti yang Anda inginkan adalah INNER bergabung. Jatuhkan (+) dan lihat apakah Anda mendapatkan kembali apa yang Anda cari. Selain itu, @GordonLinoff memberikan saran yang sangat bagus - merasa nyaman menggunakan sintaks gabungan ANSI, yang lebih ekspresif dan lebih dapat dipahami daripada gaya lama "letakkan semua ketentuan dalam klausa WHERE lalu coba buat teka-teki" gaya .
Inilah cara saya menulis ulang kueri ini menggunakan sintaks gabungan standar 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'))
Satu masalah kecil lainnya. Saya perhatikan Anda menggunakan ANTARA dengan nilai tanggal yang berpotensi menimbulkan masalah. Katakanlah, misalnya, Anda mendapatkan EFFECTIVE_START_DATE 01-JAN-2013 dan EFFECTIVE_END_DATE 30-JUN-2013 pada beberapa baris di PER_ALL_ASSIGNMENTS_F, dan selanjutnya katakanlah bahwa tanggal dan waktu saat ini adalah 30-JUN-2013 pada 07:02:04. Mengingat nilai data ini, baris dari PER_ALL_ASSIGNMENTS_F ini akan TIDAK dipilih, meskipun Anda mungkin mengharapkannya. Masalahnya adalah ketika satu-satunya bidang yang diisi pada nilai DATE adalah hari, bulan, dan tahun, maka jam, menit, dan detik default ke nol - dengan demikian tanggal akhir benar-benar 30-JUN-2013 pukul 00:00:00, yang sebelum tanggal/waktu saat ini 30-JUN-2013 pukul 07:02:04, dan akibatnya perbandingan tanggal menyebabkan baris diabaikan. Saya tidak tahu bagaimana kolom EFFECTIVE_END_DATE diisi dalam database Anda - semoga kolom tersebut terisi penuh, mis. 30-JUN-2013 23:59:59 - tetapi jika tidak, Anda mungkin perlu membuat perbandingan tanggal seperti
TRUNC(SYSDATE) BETWEEN paaf.EFFECTIVE_START_DATE
AND paaf.EFFECTIVE_END_DATE
atau
SYSDATE BETWEEN paaf.EFFECTIVE_START_DATE
AND paaf.EFFECTIVE_END_DATE + INTERVAL '1' DAY - INTERVAL '1' SECOND
(Yang pertama mungkin merupakan pilihan yang lebih baik, karena bentuk yang terakhir akan menghalangi penggunaan indeks berbasis non-fungsi yang mungkin ada pada (EFFECTIVE_START_DATE, EFFECTIVE_END_DATE).
Bagikan dan nikmati.