Oracle
 sql >> Database >  >> RDS >> Oracle

output di due diverse query come risultato in Oracle SQL

Esistono due modi per mettere insieme le query:lateralmente utilizzando i join e uno sopra l'altro con unioni. Quando si utilizzano i join, il risultato includerà le colonne di entrambe le query. Quando si utilizzano le unioni, il risultato includerà le righe di entrambe le query. Affinché i sindacati funzionino, entrambe le query devono restituire lo stesso numero di colonne corrispondenti.

Presumo che tu voglia aggiungere il conteggio calcolato nella seconda query come colonna alla prima query. Funziona così (sto usando il nuovo JOIN sintassi):

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

Puoi anche usare INNER JOIN invece di LEFT JOIN se sai che query2 restituisce almeno una riga per ogni riga di query1 o se non sei interessato alle righe di query1 in cui mancano le righe corrispondenti da 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;

Effettuerei anche l'ordinamento dopo aver unito le due sottoquery, perché il processo di unione potrebbe distruggere qualsiasi ordine stabilito in precedenza.

C'è anche un problema con i tipi di messaggio:non stai selezionando gli stessi tipi di messaggio nelle due sottoquery. In ORACLE, puoi usare il DECODE funzione per tradurre i tipi di messaggio per farli corrispondere

Nella sottointerrogazione 1:

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

Se create_time è una DATE colonna, devi convertire la stringa data/ora in una data.

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

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

Se possibile, usa anche un anno a quattro cifre. Questo è più sicuro. È 31 1931 o 2031 ? Inoltre, un numero di mese funzionerà anche su sistemi con diverse localizzazioni. DEC non sarebbe riconosciuto su un sistema tedesco. Invece DEZ ci si aspetterebbe.