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

đầu ra của hai truy vấn khác nhau do một kết quả trong SQL oracle

Có hai cách để đặt các truy vấn lại với nhau:Đi ngang bằng cách sử dụng các phép nối và xếp chồng lên nhau bằng các kết hợp. Khi sử dụng phép nối, kết quả sẽ bao gồm các cột của cả hai truy vấn. Khi sử dụng kết hợp, kết quả sẽ bao gồm các hàng của cả hai truy vấn. Để liên kết hoạt động, cả hai truy vấn phải trả về cùng một số cột tương ứng.

Tôi giả sử rằng bạn muốn thêm số lượng được tính trong truy vấn thứ hai dưới dạng cột vào truy vấn đầu tiên. Điều này hoạt động như thế này (Tôi đang sử dụng JOIN mới cú pháp):

SELECT
    q1.x, q1.y, q2.z, ...
FROM
    (SELECT ... FROM ...) q1
    LEFT JOIN
    (SELECT ... FROM ...) q2
        ON q1.column = q2.column

Bạn cũng có thể sử dụng INNER JOIN thay vì LEFT JOIN nếu bạn biết rằng query2 mang lại ít nhất một hàng cho mỗi hàng của query1 hoặc nếu bạn không quan tâm đến các hàng từ query1 trong đó các hàng tương ứng bị thiếu trong query2.

SELECT 
    q1.message_type,
    q1.queue_seqnum,
    q1.files,
    q2.message_count
FROM (SELECT
         a.message_type,
         a.queue_seqnum,
         SUBSTR(b.char_data, 1, 2) files
      FROM
         ad_in_messageheader a,
         INNER JOIN ad_in_messagedetail b
            ON  a.queue_seqnum = b.queue_seqnum 
      WHERE
         a.message_type IN ('ERP_COSTS_SMRY', 'ERP_SALES_SMRY', 'ERP_SPEND_SMRY') AND
         a.create_time > '17-DEC-13 07.00.00 AM') q1
   LEFT JOIN
     (SELECT
         a.message_type,
         COUNT(a.message_type) message_count
      FROM
         ad_in_messageheader a 
      WHERE
         a.message_type IN ('ERP_COSTS', 'ERP_SALES', 'ERP_SPEND') AND
         create_time > '17-DEC-13 07.00.00 AM'
      GROUP BY
         a.message_type) q2
   ON q1.message_type = q2.message_type
ORDER BY
   q1.queue_seqnum DESC;

Tôi cũng sẽ thực hiện việc sắp xếp sau khi kết hợp hai truy vấn phụ, vì quá trình kết hợp có thể phá hủy bất kỳ thứ tự nào được thiết lập trước đó.

Cũng có một vấn đề với các loại thông báo:Bạn không chọn các loại thông báo giống nhau trong hai truy vấn phụ. Trong ORACLE, bạn có thể sử dụng DECODE chức năng dịch các loại thông báo để làm cho chúng phù hợp với nhau

Trong truy vấn phụ 1:

SELECT
    DECODE(a.message_type,
           'ERP_COSTS_SMRY', 'ERP_COSTS', 
           'ERP_SALES_SMRY', 'ERP_SALES',
           'ERP_SPEND_SMRY', 'ERP_SPEND') message_type

Nếu create_timeDATE , bạn phải chuyển đổi chuỗi ngày / giờ thành ngày tháng.

WHERE
    a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')

(Xem https://stackoverflow.com/a/10178346/880990 )

Cũng sử dụng năm bốn chữ số nếu có thể. Điều này là an toàn hơn. Là 31 1931 hoặc 2031 ? Ngoài ra, số tháng cũng sẽ hoạt động trên các hệ thống có ngôn ngữ khác nhau. DEC sẽ không được công nhận trên hệ thống của Đức. Thay vào đó DEZ sẽ được mong đợi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển đổi đầu ra truy vấn Oracle thành json (Oracle / NodeJS)

  2. Oracle kích hoạt kiểm tra ràng buộc hàng tháng

  3. Các chức năng phân tích LEAD và LAG

  4. ORA-12899, trong khi độ dài giá trị thực nhỏ hơn giá trị tối đa

  5. Làm thế nào chúng ta có thể phát hiện ra rằng một cột trong bảng oracle của tôi đang được điền / cập nhật bởi một trình kích hoạt của một bảng khác?