Direkt zum Hauptinhalt springen
eLearner.app
Modul 14 · Lektion 2 von 354/57 im Kurs~15 min
Lektionen des Moduls (2/3)

Mehrere und verkettete CTEs

Mehrere und verkettete CTEs

Die Eleganz von WITH-Ausdrücken kommt erst richtig zur Geltung, wenn Sie mehrere miteinander verketten. Sie können mehrere CTEs hintereinander definieren und diese durch ein Komma trennen.

Und hier ist etwas, das Refactoring-Puristen lieben: Spätere CTEs können Daten von früheren CTEs lesen und sequentielle Berechnungen Stück für Stück entpacken!

Multi-CTE-Beispiel

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
),
top_customers AS (
  SELECT * FROM premium_customers
  WHERE total_spent > 5000
)
SELECT c.first_name, tc.total_spent
FROM customers c
JOIN top_customers tc ON c.id = tc.customer_id;

Es ist Blockprogrammierung! Jeder Block erledigt nur eine Aufgabe.

Übung#sql.m14.l2.e1
Versuche: 0Wird geladen…

Definieren Sie zwei aufeinanderfolgende CTEs: 1) „order_totals“ berechnet „customer_id“ und den „order_count“, der mit `COUNT(*)` aus „orders“ platziert wurde. 2) „gold_users“ liest aus „order_totals“ und filtert Kunden mit „order_count >= 2“. Verknüpfen Sie schließlich die Tabelle „customers“ (extrahieren „first_name“ und „last_name“) mit „gold_users“ (ON). c.id = g.customer_id) und zeigen auch deren „order_count“ an.

Editor wird geladen…
Hinweis anzeigen

Trennen Sie order_totals und gold_users durch ein Komma (kein zweites WITH!)

Lösung nach 3 Versuchen verfügbar

Übung#sql.m14.l2.e2
Versuche: 0Wird geladen…

Lassen Sie uns nun mehrere CTEs verwenden, um Metriken zu vereinfachen: Erstellen Sie „max_price“ (extrahiert eine einzelne Zeile mit „max_value“ mithilfe von `MAX(unit_price)` aus „order_items“). Extrahieren Sie in der Hauptabfrage alle „product_id“ und „unit_price“ aus „order_items“ und zeigen Sie an, um wie viel sie vom Höchstpreis abweichen, indem Sie „(SELECT max_value FROM max_price) – Unit_price AS Differenz“ berechnen. Kein Join – verwenden Sie eine Unterabfrage im CTE, um einen einzelnen Wert zu erhalten!

Editor wird geladen…
Hinweis anzeigen

WITH max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;

Lösung nach 3 Versuchen verfügbar