Er zijn twee manieren om queries samen te stellen:zijdelings door gebruik te maken van joins en op elkaar met unions. Als u joins gebruikt, bevat het resultaat kolommen van beide query's. Als u vakbonden gebruikt, bevat het resultaat rijen van beide query's. Om vakbonden te laten werken, moeten beide zoekopdrachten hetzelfde aantal corresponderende kolommen retourneren.
Ik neem aan dat je het aantal berekend in de tweede query als kolom wilt toevoegen aan de eerste query. Dit werkt als volgt (ik gebruik de nieuwe JOIN
syntaxis):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Je kunt ook INNER JOIN
. gebruiken in plaats van LEFT JOIN
als u weet dat query2 ten minste één rij oplevert voor elke rij van query1 of als u niet geïnteresseerd bent in rijen uit query1 waar overeenkomstige rijen ontbreken in 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;
Ik zou ook de sortering doen na het samenvoegen van de twee subquery's, omdat het samenvoegingsproces elke eerder vastgestelde volgorde zou kunnen vernietigen.
Er is ook een probleem met de berichttypes:u selecteert niet dezelfde berichttypes in de twee subquery's. In ORACLE kun je de DECODE
. gebruiken functie om de berichttypes te vertalen zodat ze overeenkomen
In subquery 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Als create_time
is een DATE
kolom, moet u de datum/tijd-tekenreeks naar een datum converteren.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(Zie https://stackoverflow.com/a/10178346/880990 )
Gebruik indien mogelijk ook een jaartal van vier cijfers. Dit is veiliger. Is 31
1931
of 2031
? Ook werkt een maandnummer ook op systemen met verschillende landinstellingen. DEC
zou niet worden herkend op een Duits systeem. In plaats daarvan DEZ
zou worden verwacht.