Die SQL WITH-Klausel wurde von Oracle in der Oracle 9i Release 2-Datenbank eingeführt. Mit der SQL WITH-Klausel können Sie einem Unterabfrageblock einen Namen geben (ein Prozess, der auch Unterabfrage-Refactoring genannt wird), auf den an mehreren Stellen in der Haupt-SQL-Abfrage verwiesen werden kann.
- Die Klausel wird zum Definieren einer temporären Beziehung verwendet, sodass die Ausgabe dieser temporären Beziehung verfügbar ist und von der Abfrage verwendet wird, die der WITH-Klausel zugeordnet ist.
- Abfragen, denen eine WITH-Klausel zugeordnet ist, können auch mithilfe verschachtelter Unterabfragen geschrieben werden. Dies erhöht jedoch die Komplexität beim Lesen/Debuggen der SQL-Abfrage.
- Die WITH-Klausel wird nicht von allen Datenbanksystemen unterstützt.
- Der der Unterabfrage zugewiesene Name wird so behandelt, als wäre es eine Inline-Ansicht oder Tabelle
- Die SQL WITH-Klausel wurde von Oracle in der Oracle 9i Release 2-Datenbank eingeführt.
Syntax:
WITH temporaryTable (averageValue) as (SELECT avg(Attr1) FROM Table) SELECT Attr1 FROM Table, temporaryTable WHERE Table.Attr1>temporaryTable.averageValue;>

In dieser Abfrage wird die WITH-Klausel verwendet, um eine temporäre Beziehung „temporaryTable“ zu definieren, die nur ein Attribut „averageValue“ hat. AverageValue enthält den Durchschnittswert der in der Beziehungstabelle beschriebenen Spalte Attr1. Die SELECT-Anweisung, die auf die WITH-Klausel folgt, erzeugt nur die Tupel, bei denen der Wert von Attr1 in der Beziehungstabelle größer ist als der Durchschnittswert, der aus der WITH-Klausel-Anweisung erhalten wird.
Notiz: Wenn eine Abfrage mit einer WITH-Klausel ausgeführt wird, wird zunächst die in der Klausel genannte Abfrage ausgewertet und die Ausgabe dieser Auswertung in einer temporären Beziehung gespeichert. Anschließend wird schließlich die mit der WITH-Klausel verknüpfte Hauptabfrage ausgeführt, die die erzeugte temporäre Beziehung verwenden würde.
Abfragen
Beispiel 1: Finden Sie alle Mitarbeiter, deren Gehalt über dem Durchschnittsgehalt aller Mitarbeiter liegt.
Name der Relation: Mitarbeiter
| Angestellten ID | Name | Gehalt |
|---|---|---|
| 100011 | Schmied | 50000 |
| 100022 | Rechnung | 94000 |
| 100027 | Sich selbst | 70550 |
| 100845 | Walden | 80000 |
| 115585 | Erik | 60000 |
| 1100070 | Kate | 69000 |
SQL-Abfrage:
WITH temporaryTable(averageValue) as (SELECT avg(Salary) from Employee) SELECT EmployeeID,Name, Salary FROM Employee, temporaryTable WHERE Employee.Salary>temporaryTable.averageValue;>
Ausgabe:
| Angestellten ID | Name | Gehalt |
|---|---|---|
| 100022 | Rechnung | 94000 |
| 100845 | Walden | 80000 |
Erläuterung: Das durchschnittliche Gehalt aller Mitarbeiter beträgt 70591. Daher liegen alle Mitarbeiter, deren Gehalt über dem ermittelten Durchschnitt liegt, im Output-Verhältnis.
Beispiel 2: Finden Sie alle Fluggesellschaften, bei denen das Gesamtgehalt aller Piloten dieser Fluggesellschaft über dem Durchschnitt des Gesamtgehalts aller Piloten in der Datenbank liegt.
Name der Relation: Pilot
| Angestellten ID | Fluggesellschaft | Name | Gehalt |
|---|---|---|---|
| 70007 | Airbus 380 | Kim | 60000 |
| 70002 | Boeing | Laura | 20000 |
| 10027 | Airbus 380 | Wille | 80050 |
| 10778 | Airbus 380 | Labyrinth | 80780 |
| 115585 | Boeing | Schmied | 25000 |
| 114070 | Airbus 380 | Katy | 78000 |
SQL-Abfrage:
WITH totalSalary(Airline, total) as (SELECT Airline, sum(Salary) FROM Pilot GROUP BY Airline), airlineAverage(avgSalary) as (SELECT avg(Salary) FROM Pilot ) SELECT Airline FROM totalSalary, airlineAverage WHERE totalSalary.total>airlineAverage.avgSalary;>
Ausgabe:
| Fluggesellschaft |
|---|
| Airbus 380 |
Erläuterung: Das Gesamtgehalt aller Piloten von Airbus 380 = 298.830 und das von Boeing = 45.000. Durchschnittsgehalt aller Piloten in der Tabelle Pilot = 57305. Da nur das Gesamtgehalt aller Piloten von Airbus 380 höher ist als das erhaltene Durchschnittsgehalt, also Airbus 380 liegt im Leistungsverhältnis.
Wichtige Punkte:
- Die SQL WITH-Klausel eignet sich gut für die Verwendung mit komplexen SQL-Anweisungen statt mit einfachen
- Außerdem können Sie komplexe SQL-Abfragen in kleinere aufteilen, was das Debuggen und Verarbeiten komplexer Abfragen erleichtert.
- Die SQL WITH-Klausel ist im Grunde ein direkter Ersatz für die normale Unterabfrage.