SQL > SQL Befehle > WITH 

Manchmal steht man vor einer komplexen Frage, die nicht einfach mit einer einzelnen SQL-Anweisung beantwortet werden kann.

Man könnte versuchen, die Antwort in einem Durchlauf zu erhalten, indem man mehrere Inline-Ansichten oder mehrere Unterabfragen verwendet, aber das wird wahrscheinlich dazu führen, dass der SQL-Code schwer verständlich wird, und einige SQL-Varianten, wie z.B. Hive SQL, erlauben keine mehrfachen Unterabfragen.

Ein zweiter Ansatz besteht darin, die Komplexität in mehrere Schritte aufzuteilen. Eine Möglichkeit, dies zu tun, besteht darin, mehrere Tabellen zu erstellen, wobei jede Tabelle die Ergebnisse eines jeden Schritts speichert. Dies ist oft eine gute Strategie, da dies die Fehlersuche erleichtert und das Verfolgen der Ausführung des Codes einfacher wird.

Allerdings ist der unerwünschte Nebeneffekt, dass man sich daran erinnern muss, diese Tabellen nach Abschluss der Analyse zu löschen; andernfalls verbleiben diese Tabellen in der Datenbank und führen zu Problemen bei der Datenbankverwaltung.

Die Alternative zur Erstellung mehrerer Tabellen besteht darin, die WITH-Klausel in SQL zu verwenden.

Syntax

Die grundlegende Syntax für die WITH-Klausel sieht wie folgt aus:

WITH <Abfrage_Name_1> AS (
SELECT-Anweisung 1
)
Haupt SELECT-Anweisung

Die Verwendung der WITH-Klausel ähnelt sehr der Erstellung von Tabellen. Wenn Sie eine Tabelle erstellen, geben Sie ihr einen Namen. Ebenso, wenn Sie die WITH-Klausel verwenden, geben Sie ihr ebenfalls einen Namen, und dieser Name fungiert im Wesentlichen wie ein Tabellenname in der Haupt-SQL-Anweisung.

Da die WITH-Klausel keine Tabelle oder Ansicht erstellt, verschwindet das Objekt, das mit der WITH-Anweisung verknüpft ist, nachdem die Haupt-SQL-Anweisung ausgeführt wurde, und es gibt nichts zu bereinigen.

Sie können auch mehrere WITH-Klauseln haben. Die Syntax lautet wie folgt:

WITH <Abfrage_Name_1> AS (
SELECT-Anweisung 1
), <Abfrage_Name_2> AS (
SELECT-Anweisung 2
),
..
<Abfrage_Name_N> AS (
SELECT-Anweisung N
)
Haupt SELECT-Anweisung

Um mehrere WITH-Klauseln zu haben, müssen Sie die WITH-Klausel nicht mehrmals angeben. Stattdessen fügen Sie nach Abschluss der ersten WITH-Klausel ein Komma hinzu, und dann können Sie die nächste Klausel angeben, indem Sie mit <Abfrage_Name> gefolgt von ALS beginnen. Es gibt kein Komma zwischen der letzten WITH-Klausel und der Haupt-SQL-Anfrage.

Beispiele

Wir verwenden die folgende Tabelle in unseren Beispielen.

Tabelle Store_Sales

 Store_Name  Sales 
 Los Angeles  15000 
 San Diego  2500 
 New York  3000 
 Boston  7000 

Beispiel 1: Verwendung von WITH in einer SELECT-Anweisung

Angenommen, wir möchten alle Geschäfte auflisten, die mehr Umsatz als der Durchschnitt haben. Dazu können wir die folgende WITH-Anweisung verwenden:

WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

Ergebnis:

Store_Name Sales
Los Angeles 15000
Boston 7000

Die WITH-Anweisung berechnet den durchschnittlichen Umsatzbetrag (der $6.875 beträgt), und dann gibt die Haupt-SQL-Anfrage einfach alle Zeilen zurück, bei denen der Wert in der Spalte Umsatz größer ist als dieser Durchschnittsbetrag.

Ein äquivalenter SQL mit Inline-Ansicht wäre:

SELECT a1.* FROM Store_Sales a1,
(SELECT AVG(Sales) AVG_SALES FROM Store_Sales) t1
WHERE a1.Sales > t1.AVG_SALES;

Ebenso kann dies durch den folgenden SQL unter Verwendung einer Unterabfrage erreicht werden:

SELECT a1.* FROM Store_Sales a1
WHERE a1.Sales >
(SELECT AVG(Sales) AVG_SALES FROM Store_Sales);

Beachten Sie, dass die Version mit Unterabfrage in Hive SQL aufgrund der Art und Weise, wie Hive SQL Unterabfragen unterstützt, nicht funktioniert.

Beispiel 2: Verwenden von WITH in einer CREATE TABLE-Anweisung

Wir können WITH auch zusammen mit einer CREATE TABLE-Anweisung verwenden. Angenommen, wir möchten eine Tabelle mit der WITH-Klausel aus dem vorherigen Beispiel erstellen, würden wir folgendes eingeben:

CREATE TABLE Above_Average_Sales
AS
WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;

Der WITH-Teil der Abfrage erfolgt nach CREATE TABLE AS. Die WITH-Klausel sollte nicht am Anfang stehen. Die folgende Abfrage wird einen Fehler verursachen:

WITH t1 AS (
SELECT AVG(Sales) AVG_SALES FROM Store_Sales
)
CREATE TABLE Above_Average_Sales
AS
SELECT a1.* FROM Store_Sales a1, t1
WHERE a1.Sales > t1.AVG_SALES;


SQL EXISTS >>

Diese Seite wurde zuletzt am 16.10.2023 aktualisiert




Copyright © 2024   1keydata.com   Alle Rechte vorbehalten