Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Gabung luar Oracle tidak berfungsi seperti yang diharapkan

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perbedaan konversi implisit aliran data CAST vs ssis

  2. java.lang.ArithmeticException saat mencoba mendapatkan koneksi di Oracle 11.2.0.2.0 (64 bit)

  3. Melewati array asosiatif sebagai parameter antar paket

  4. SQLRecoverableException:Pengecualian I/O:Reset koneksi

  5. Bandingkan gambar BLOB dengan gambar yang disimpan sebagai ORDImage menggunakan SQL/MM Still Image