Data Engineering
Verfasst von: Sajagan Thirugnanam and Austin Levine
Zuletzt aktualisiert am 6. Oktober 2024
Der Zweck dieses Artikels ist es, Ihnen ein tiefes Verständnis dafür zu vermitteln, wie rekursive Tabellen funktionieren. Nach dem Lesen dieses Artikels sollten Sie in der Lage sein, eine rekursive Tabelle zu erstellen und ein umfassendes Verständnis der zugrunde liegenden Logik zu haben.
Definition von CTE
Zunächst einmal müssen wir sicherstellen, dass Sie verstehen, wofür CTE steht, bevor wir uns in die Welt der rekursiven CTEs stürzen. CTE steht für Common Table Expression, was eine temporäre Ergebnismenge darstellt. Es ist in Bezug auf die Logik einer Unterabfrage ähnlich, jedoch viel einfacher zu lesen.
Sie können eine CTE mit der WITH-Klausel definieren. Auf die WITH-Klausel folgt eine Liste von einer oder mehreren CTEs, von denen jede durch eine SELECT-Anweisung definiert wird.
Es gibt zwei Arten von CTEs: nicht-rekursive CTEs und rekursive CTEs. Lassen Sie uns diese separat erkunden.
Nicht-rekursive CTE
Die allgemeine Form, die wir zuvor beschrieben haben, bezieht sich hauptsächlich auf nicht-rekursive CTEs. Zur Wiederholung: Es beginnt mit dem Schlüsselwort "WITH." Dann geben Sie Ihrer CTE einen Namen, gefolgt vom Schlüsselwort "AS", und definieren die CTE in Klammern. Der zweite Teil der Syntax besteht aus einer einfachen SELECT-Anweisung, die direkt nach der rekursiven CTE geschrieben wird, ohne Kommata, Semikolons oder ähnliche Satzzeichen. Wie bereits erwähnt, wird die CTE in einer anderen Abfrage wie jede andere Tabelle verwendet, und genau das erreicht die SELECT-Anweisung. Hier ist die allgemeine Syntax:
WITH cte_name AS (cte_query_definition) SELECT * FROM cte_name;

Quelle: mariadb.com
Und hier ist ein Beispiel:
WITH recent_orders AS ( SELECT customer_id, order_date FROM orders WHERE order_date >= CURRENT_DATE - INTERVAL 1 MONTH ) SELECT customer_id, COUNT(*) AS num_orders FROM recent_orders GROUP BY customer_id
Rekursive CTE
Der Hauptunterschied einer rekursiven CTE besteht darin, dass sie sich in der SELECT-Anweisung auf sich selbst bezieht und letztendlich eine Schleife erstellt. Abgesehen davon ist die allgemeine Syntax die gleiche, mit der Ausnahme, dass nach der WITH-Klausel auch das Wort RECURSIVE hinzugefügt werden muss. Wenn es das tut, wiederholt es sich ständig selbst und stoppt nur, wenn alle Ergebnisse zurückgegeben wurden.
WITH RECURSIVE cte_name AS ( cte_query_definition (das Anker-Mitglied) UNION ALL cte_query_definition (das rekursive Mitglied) ) SELECT * FROM cte_name;
Der Hauptzweck von rekursiven CTEs ist die Verwendung, wenn Sie hierarchische Daten abfragen müssen. Ein gutes Beispiel wäre eine Mitarbeitertabelle, bei der die Hierarchie jedes Mitarbeiters basierend auf seinen Vorgesetzten ermittelt werden soll. Angenommen, wir haben eine Mitarbeitertabelle, die folgende Informationen enthält:
employee_id
manager_id
name
WITH RECURSIVE company_hierarchy AS ( SELECT employee_id, manager_id, name, 1 FROM employees WHERE manager_id IS NULL UNION ALL SELECT e.employee_id, e.manager_id, e.name, ch.level + 1 FROM employees e JOIN company_hierarchy ch ON e.manager_id = ch.employee_id ) SELECT * FROM company_hierarchy;
Das Endergebnis der obigen Tabelle wäre eine Tabelle mit allen Mitarbeitern, ihren jeweiligen Managern sowie ihren Namen und der Hierarchieebene.
Rekursive CTEs können verwendet werden, um eine Vielzahl von Problemen zu lösen, wie zum Beispiel:
Durchlaufen hierarchischer Datenstrukturen
Finden aller Pfade zwischen zwei Knoten in einem Diagramm
Berechnung transitiver Beziehungen
Berechnung kumulativer Summen
Zusammenfassend lässt sich sagen, dass rekursive Common Table Expressions (CTEs) in SQL eine Welt von Möglichkeiten für die Handhabung hierarchischer Datenstrukturen und die Lösung komplexer Probleme mit eleganten, effizienten Lösungen eröffnen.
Bezogen auf Data Engineering
