Der er to måder at sætte forespørgsler sammen på:Sidelæns ved at bruge joins og oven på hinanden med fagforeninger. Når du bruger joinforbindelser, vil resultatet inkludere kolonner for begge forespørgsler. Når du bruger fagforeninger, vil resultatet inkludere rækker af begge forespørgsler. For at fagforeninger skal fungere, skal begge forespørgsler returnere det samme antal tilsvarende kolonner.
Jeg går ud fra, at du vil tilføje antallet beregnet i den anden forespørgsel som kolonne til den første forespørgsel. Dette fungerer sådan her (jeg bruger den nye JOIN
). syntaks):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Du kan også bruge INNER JOIN
i stedet for LEFT JOIN
hvis du ved, at forespørgsel2 giver mindst én række for hver række af forespørgsel1, eller hvis du ikke er interesseret i rækker fra forespørgsel1, hvor tilsvarende rækker mangler fra forespørgsel2.
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;
Jeg ville også sortere efter sammenføjning af de to underforespørgsler, fordi sammenføjningsprocessen kunne ødelægge enhver ordre etableret før.
Der er også et problem med meddelelsestyperne:Du vælger ikke de samme meddelelsestyper i de to underforespørgsler. I ORACLE kan du bruge DECODE
funktion til at oversætte meddelelsestyperne for at få dem til at matche
I underforespørgsel 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Hvis create_time
er en DATE
kolonne, skal du konvertere dato/klokkeslæt strengen til en dato.
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 )
Brug også et firecifret årstal, hvis det er muligt. Dette er mere sikkert. Er 31
1931
eller 2031
? Et månedsnummer vil også fungere på systemer med forskellige lokaliteter. DEC
ville ikke blive anerkendt på et tysk system. I stedet for DEZ
ville forventes.