Common Table Expressions (CTEs) sind temporäre, als Ergebnissätze mit dem Namen Ergebnissen, die innerhalb des Ausführungsbereichs einer einzelnen SQL -Anweisung vorhanden sind. Sie sind mit der WITH
-Klausel definiert, gefolgt von der CTE -Definition und dann der Hauptabfrage, die den CTE verwendet. Auf diese Weise können Sie eine komplexe Abfrage in kleinere, überschaubarere Teile zerlegen und die Lesbarkeit und Wartbarkeit verbessern.
Lassen Sie uns mit einem Beispiel veranschaulichen. Angenommen, Sie haben zwei Tabellen: Orders
und Customers
. Sie möchten alle Bestellungen von Kunden aus einer bestimmten Stadt finden, sagen "London". Eine komplexe Abfrage ohne CTEs könnte so aussehen:
<code class="sql">SELECT o.OrderID, o.OrderDate, c.CustomerID, c.CustomerName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID WHERE c.City = 'London';</code>
Mit einem CTE können wir dies vereinfachen:
<code class="sql">WITH LondonCustomers AS ( SELECT CustomerID FROM Customers WHERE City = 'London' ) SELECT o.OrderID, o.OrderDate, c.CustomerID, c.CustomerName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID WHERE c.CustomerID IN (SELECT CustomerID FROM LondonCustomers);</code>
Die LondonCustomers
CTE wählt alle CustomerIDs aus London aus. Die Hauptabfrage verwendet dann dieses CTE, um die Bestellungen zu filtern. Dieser Ansatz ist klarer und leichter zu verstehen als der ursprüngliche Einzelquerationsansatz, insbesondere für kompliziertere Abfragen, an denen mehrere Verbindungen und Filter beteiligt sind. Der CTE modularisiert die Abfrage effektiv und erleichtert das Debuggen und Aufrechterhalten.
Während sowohl CTEs als auch Unterabfragen ähnliche Ergebnisse erzielen können, bieten CTEs mehrere Vorteile:
Absolut! CTEs verbessern die Lesbarkeit und Wartbarkeit von SQL -Code, insbesondere für komplexe Abfragen, erheblich. Durch die Aufschlüsselung einer großen Abfrage in kleinere, logische Einheiten verbessert CTEs die Gesamtstruktur und die Organisation des Codes. Dies erleichtert es, die Logik der Abfrage zu verstehen, Fehler zu identifizieren und Änderungen vorzunehmen. Die Verwendung beschreibender Namen für CTES verbessert die Lesbarkeit weiter und ermöglicht es Entwicklern, den Zweck jedes Teils der Abfrage schnell zu erfassen. Dies führt zu einer verkürzten Entwicklungszeit, weniger Fehlern und einer einfacheren Zusammenarbeit zwischen Teammitgliedern.
Rekursive CTEs sind ein leistungsstarkes Instrument zur Behandlung hierarchischer Daten wie Organisationsdiagramme, Materialien oder Dateisystemen. Sie ermöglichen es Ihnen, eine hierarchische Struktur zu durchqueren, indem Sie sich wiederholt in der CTE -Definition verweisen.
Die Struktur eines rekursiven CTE umfasst zwei Teile:
Betrachten wir ein Beispiel für ein Organisationsdiagramm:
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( -- Anchor member: Select the top-level employees SELECT EmployeeID, ManagerID, EmployeeName, Level = 0 FROM Employees WHERE ManagerID IS NULL UNION ALL -- Recursive member: Join the CTE to itself to get subordinates SELECT e.EmployeeID, e.ManagerID, e.EmployeeName, eh.Level 1 FROM Employees e INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID ) SELECT * FROM EmployeeHierarchy;</code>
Dieser rekursive CTE beginnt mit den Mitarbeitern der obersten Ebene (die ohne Manager). Das rekursive Mitglied verbindet dann die CTE in die Tabelle Employees
, um die Untergebenen jedes Mitarbeiters zu finden und die Level
für jede Ebene in der Hierarchie zu erhöhen. Dies wird fortgesetzt, bis alle Mitarbeiter in die Ergebnismenge enthalten sind. Die UNION ALL
die Ergebnisse des Anker- und rekursiven Mitglieder. Die Ebene Level
hilft, die hierarchische Struktur zu visualisieren. Das WHERE ManagerID IS NULL
sicher, dass nur die Mitarbeiter der obersten Ebene in die erste Auswahl enthalten sind. Dies ist ein entscheidender Bestandteil der Vermeidung von unendlicher Rekursion. Denken Sie daran, immer eine klare Kündigungsbedingung zu haben, um unendliche Schleifen zu verhindern.
Das obige ist der detaillierte Inhalt vonWie benutze ich in SQL gemeinsame Tabellenausdrücke (CTEs), um komplexe Abfragen zu vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!