Det finns två sätt att sätta samman frågor:i sidled genom att använda sammanfogningar och ovanpå varandra med fackföreningar. När du använder kopplingar kommer resultatet att inkludera kolumner för båda frågorna. När du använder fackföreningar kommer resultatet att inkludera rader med båda frågorna. För att fackföreningar ska fungera måste båda frågorna returnera samma antal motsvarande kolumner.
Jag antar att du vill lägga till antalet beräknade i den andra frågan som kolumn till den första frågan. Det här fungerar så här (jag använder den nya JOIN
). syntax):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Du kan också använda INNER JOIN
istället för LEFT JOIN
om du vet att query2 ger minst en rad för varje rad i query1 eller om du inte är intresserad av rader från query1 där motsvarande rader saknas i 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;
Jag skulle också göra sorteringen efter att ha sammanfogat de två underfrågorna, eftersom sammanfogningsprocessen kan förstöra alla beställningar som upprättats tidigare.
Det finns också ett problem med meddelandetyperna:Du väljer inte samma meddelandetyper i de två underfrågorna. I ORACLE kan du använda
I underfråga 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Om create_time
är ett DATE
kolumnen måste du konvertera datum/tid-strängen till ett datum.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(Se https://stackoverflow.com/a/10178346/880990 )
Använd även ett fyrsiffrigt årtal om möjligt. Det här är säkrare. Är 31
1931
eller 2031
? Ett månadsnummer fungerar också på system med olika lokaler. DEC
inte skulle erkännas på ett tyskt system. Istället DEZ
skulle förväntas.