Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Ausgabe von zwei verschiedenen Abfragen als ein Ergebnis in Oracle SQL

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.