In Ihrem Beispiel, wie sie von allen Responder gezeigt, die Sie nicht getrennte Abfragen benötigen, Sie können alles auf einmal machen.
Angenommen, Sie möchten den Unterschied zwischen der Summe von Spalte1 für einige Filterbedingungen, z. B. where a.id = '123'
, und anderen Filterbedingungen, z. B. where a.id = '456'
. Dann könnten Sie die Summen in zwei unabhängigen Abfragen getrennt berechnen, wie Sie es getan haben. Dann verwenden Sie sie als Unterabfragen in einer übergeordneten Abfrage. Die Unterabfragen sollten genau eine Zeile und eine Spalte zurückgeben (wie es bei Ihren Abfragen der Fall ist), und sie müssen von runden Klammern umgeben sein. Wie so:
select (select sum(column1) from table1 where id = '123) -
(select sum(col1) from table1 where id = '456') from dual;
(Normalerweise wählt man nicht von Dual - dieser Ausdruck, ohne „wählen“ und „von dual“, kann dazu verwendet werden, wo würden Sie normalerweise eine Nummer.)
HINWEIS: Diese Abbildung soll nur zeigen, wie "skalare Unterabfragen" überall dort verwendet werden können, wo Zahlen verwendet werden können. (Oder abhängig vom Datentyp: Skalare Unterabfragen, die ein Datum oder eine Zeichenfolge zurückgeben, können überall dort verwendet werden, wo ein Datum oder eine Zeichenfolge verwendet werden könnte). Das Beispiel, das ich gab, zieht Summen aus der gleichen Tabelle, ist ineffizient und kann besser mit Case-Ausdrücke durchgeführt werden. Wenn die Summen aus zwei verschiedenen Tabellen kämen, gäbe es keine solche "effizientere" Lösung. Sehen Sie die Diskussion mit Boneist in den Kommentaren unten.
Warum diese ORDER BY-Klauseln? Führt Oracle keinen Fehler auf? – jarlh
Funktioniert 'sum (column1) - sum (column2)' nicht? – Aleksej
funktioniert für sum (columm1) - sum (column2). danke – sangeetha