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.