Existují dva způsoby, jak skládat dotazy dohromady:Sideways pomocí spojení a nad sebou pomocí spojení. Při použití spojení bude výsledek obsahovat sloupce obou dotazů. Při použití sjednocení bude výsledek zahrnovat řádky obou dotazů. Aby sjednocení fungovalo, musí oba dotazy vracet stejný počet odpovídajících sloupců.
Předpokládám, že chcete přidat počet vypočítaný ve druhém dotazu jako sloupec k prvnímu dotazu. Funguje to takto (používám nový JOIN
syntaxe):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Můžete také použít INNER JOIN
místo LEFT JOIN
pokud víte, že dotaz2 poskytuje alespoň jeden řádek pro každý řádek dotazu1 nebo pokud vás nezajímají řádky z dotazu1, kde odpovídající řádky v dotazu2 chybí.
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;
Také bych provedl řazení po spojení dvou dílčích dotazů, protože proces spojení by mohl zničit jakoukoli dříve vytvořenou objednávku.
Existuje také problém s typy zpráv:Nevybíráte stejné typy zpráv ve dvou dílčích dotazech. V ORACLE můžete použít DECODE
funkce pro překlad typů zpráv, aby se shodovaly
V dílčím dotazu 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Pokud create_time
je DATE
musíte převést řetězec data/času na datum.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(Viz https://stackoverflow.com/a/10178346/880990 )
Pokud je to možné, použijte také čtyřmístný rok. To je bezpečnější. je 31
1931
nebo 2031
? Také číslo měsíce bude fungovat také na systémech s různými lokalitami. DEC
by v německém systému nebyly uznány. Místo toho DEZ
by se dalo očekávat.