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_time
là DATE
, 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.