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

output dari dua kueri berbeda sebagai satu hasil di Oracle SQL

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PERIKSA KENDALA di Oracle SQL

  2. Lewati objek tipe tabel sebagai parameter input ke Prosedur Tersimpan di Oracle dari C #

  3. Baris SQL menjadi Kolom

  4. Oracle:bagaimana cara UPSERT (memperbarui atau memasukkan ke dalam tabel?)

  5. Bagaimana cara mengembalikan baris berdasarkan pengguna database dan isi tabel?