Es gibt zwei Möglichkeiten, Abfragen zusammenzustellen:Seitwärts mit Joins und übereinander mit Unions. Bei Verwendung von Joins enthält das Ergebnis Spalten beider Abfragen. Bei Verwendung von Unions enthält das Ergebnis Zeilen beider Abfragen. Damit Vereinigungen funktionieren, müssen beide Abfragen dieselbe Anzahl entsprechender Spalten zurückgeben.
Ich gehe davon aus, dass Sie die in der zweiten Abfrage berechnete Anzahl als Spalte zur ersten Abfrage hinzufügen möchten. Das funktioniert so (ich verwende den neuen JOIN
Syntax):
SELECT
q1.x, q1.y, q2.z, ...
FROM
(SELECT ... FROM ...) q1
LEFT JOIN
(SELECT ... FROM ...) q2
ON q1.column = q2.column
Sie können auch INNER JOIN
verwenden statt LEFT JOIN
wenn Sie wissen, dass Abfrage2 mindestens eine Zeile für jede Zeile von Abfrage1 liefert, oder wenn Sie nicht an Zeilen aus Abfrage1 interessiert sind, wo entsprechende Zeilen aus Abfrage2 fehlen.
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;
Ich würde die Sortierung auch nach dem Verbinden der beiden Unterabfragen durchführen, da der Verbindungsprozess jede zuvor festgelegte Reihenfolge zerstören könnte.
Es gibt auch ein Problem mit den Nachrichtentypen:Sie wählen in den beiden Unterabfragen nicht dieselben Nachrichtentypen aus. In ORACLE können Sie den DECODE
verwenden Funktion zum Übersetzen der Nachrichtentypen, damit sie übereinstimmen
In Unterabfrage 1:
SELECT
DECODE(a.message_type,
'ERP_COSTS_SMRY', 'ERP_COSTS',
'ERP_SALES_SMRY', 'ERP_SALES',
'ERP_SPEND_SMRY', 'ERP_SPEND') message_type
Wenn create_time
ist ein DATE
-Spalte müssen Sie die Datums-/Zeitzeichenfolge in ein Datum umwandeln.
WHERE
a.create_time > TO_DATE('17-12-2013 19:00:00', 'DD-MM-YYYY HH24:MI:SS')
(Siehe https://stackoverflow.com/a/10178346/880990 )
Verwenden Sie möglichst auch eine vierstellige Jahreszahl. Das ist sicherer. Ist 31
1931
oder 2031
? Außerdem funktioniert eine Monatsnummer auch auf Systemen mit unterschiedlichen Gebietsschemas. DEC
auf einem deutschen System nicht erkannt werden. Statt DEC
zu erwarten wäre.