Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Tham gia bên ngoài Oracle không hoạt động như mong đợi

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chế độ xem ALL_PROCEDURES không hiển thị PROCEDURE_NAME

  2. lặp qua một mảng cho điều kiện where pl / sql

  3. ORACLE - JSON Tới Bảng Cặp Giá trị Chính

  4. Chuyển đổi Int32 sang số Oracle (5) với EF4

  5. chuyển đổi xml sang oracle