Ada dua cara untuk menyatukan kueri:Sideways dengan menggunakan gabungan dan di atas satu sama lain dengan serikat pekerja. Saat menggunakan gabungan, hasilnya akan menyertakan kolom dari kedua kueri. Saat menggunakan gabungan, hasilnya akan menyertakan baris dari kedua kueri. Agar serikat pekerja berfungsi, kedua kueri harus mengembalikan jumlah kolom terkait yang sama.
Saya berasumsi bahwa Anda ingin menambahkan hitungan yang dihitung dalam kueri kedua sebagai kolom ke kueri pertama. Ini berfungsi seperti ini (saya menggunakan JOIN
new baru sintaks):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Anda juga dapat menggunakan INNER JOIN
alih-alih LEFT JOIN
jika Anda mengetahui bahwa kueri2 menghasilkan setidaknya satu baris untuk setiap baris kueri1 atau jika Anda tidak tertarik dengan baris dari kueri1 yang baris terkaitnya hilang dari kueri2.
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;
Saya juga akan melakukan pengurutan setelah bergabung dengan dua sub kueri, karena proses penggabungan dapat menghancurkan semua pesanan yang telah dibuat sebelumnya.
Ada juga masalah dengan jenis pesan:Anda tidak memilih jenis pesan yang sama di dua sub kueri. Di ORACLE, Anda dapat menggunakan DECODE
berfungsi untuk menerjemahkan jenis pesan agar cocok
Dalam sub kueri 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Jika create_time
adalah DATE
kolom, Anda harus mengonversi string tanggal/waktu menjadi tanggal.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(Lihat https://stackoverflow.com/a/10178346/880990 )
Juga gunakan tahun empat digit jika memungkinkan. Ini lebih aman. Apakah 31
1931
atau 2031
? Juga, nomor bulan akan bekerja juga pada sistem dengan lokal yang berbeda. DEC
tidak akan diakui pada sistem Jerman. Alih-alih DEZ
diharapkan.