Dateningenieurwesen
Verfasst von: Sajagan Thirugnanam und Austin Levine
Zuletzt aktualisiert am 6. Oktober 2024
Der Zweck dieses Artikels ist es, Ihnen zu helfen, ein tiefes Verständnis dafür zu erlangen, wie rekursive Tabellen funktionieren. Nach dem Lesen dieses Artikels sollten Sie in der Lage sein, eine rekursive Tabelle zu konstruieren und ein umfassendes Verständnis der zugrunde liegenden Logik zu haben.
Definition von CTE
Das Wichtigste zuerst. Bevor wir in die Welt der rekursiven CTEs eintauchen, ist es wichtig sicherzustellen, dass Sie verstehen, wofür CTE steht. CTE ist die Abkürzung für Common Table Expression, die eine temporäre Ergebnismenge darstellt. Sie ist vergleichbar mit einer Unterabfrage in Bezug auf die Logik, jedoch viel einfacher zu lesen.
Sie können eine CTE mit der WITH-Klausel definieren. Der WITH-Klausel folgt eine Liste von einem 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 betrachten.
Nicht-Rekursive CTE
Die allgemeine Form, die wir zuvor beschrieben haben, bezieht sich hauptsächlich auf nicht-rekursive CTEs. Zur Erinnerung: Es beginnt mit dem Schlüsselwort "WITH." Anschließend geben Sie einen Namen für Ihre CTE an, gefolgt vom Schlüsselwort "AS", und Sie definieren die CTE in Klammern. Der zweite Teil der Syntax besteht aus einer einfachen SELECT-Anweisung, die unmittelbar nach der rekursiven CTE geschrieben wird, ohne Kommas, Semikolons oder ähnliche Satzzeichen. Wie bereits erwähnt, wird die CTE in einer anderen Abfrage genau wie jede andere Tabelle verwendet, und genau das wird mit der SELECT-Anweisung erreicht. 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 selbst referenziert und schließlich eine Schleife erstellt. Abgesehen davon ist die allgemeine Syntax dieselbe., abgesehen von der Tatsache, dass Sie nach der With-Klausel auch das Wort RECURSIVE hinzufügen müssen. Was sie tut, ist, dass sie sich ständig wiederholt und nur stoppt, wenn sie alle Ergebnisse zurückgibt.
WITH RECURSIVE cte_name AS ( cte_query_definition (das Anker-Element) UNION ALL cte_query_definition (das rekursive Element) ) SELECT * FROM cte_name;
Der primäre Zweck rekursiver CTEs besteht darin, verwendet zu werden, wenn Sie hierarchische Daten abfragen müssen. Ein gutes Beispiel wäre eine Mitarbeitertabelle zu haben und die Hierarchie jedes Mitarbeiters basierend auf deren Vorgesetzten zu bestimmen. 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 endgültige Ergebnis der obigen Tabelle wäre eine Tabelle mit allen Mitarbeitern und ihren jeweiligen Managern zusammen mit ihren Namen und der Hierarchieebene.
Rekursive CTEs können verwendet werden, um eine Vielzahl von Problemen zu lösen, wie zum Beispiel:
Durchlaufen von hierarchischen Datenstrukturen
Alle Wege zwischen zwei Knoten in einem Graphen finden
TRANSITIVE-Beziehungen berechnen
Kumulative Gesamtsummen berechnen
Zusammenfassend eröffnen rekursive Common Table Expressions (CTEs) in SQL eine Welt von Möglichkeiten, um hierarchische Datenstrukturen zu verwalten und komplexe Probleme mit eleganten, effizienten Lösungen zu lösen.
Bezogen auf Dateningenieurwesen
