Rekursive MySQL-Abfrage
In diesem Handbuch lernen wir die rekursive
Abfrage von MySQL kennen. Wie Sie eine rekursive
Abfrage in SQL schreiben und wie sie funktioniert, wird Ihnen in dieser Anleitung zum besseren Verständnis erklärt.
MySQL Rekursive
Abfrage
Die rekursive
Abfrage in SQL ist eine Unterabfrage; Wie der Name schon sagt, arbeitet es rekursiv. Es hat einen Basisfall, einen benutzerdefinierten Namen und einen rekursiven Fall mit einer Beendigungsbedingung.
with [Recursive] CTE(user_defined name) AS
(
SELECT query (Non Recursive query or the Base query)
UNION
SELECT query (recursive query using the name [with a termination condition])
)
SELECT * from CTE_name;
Das Obige ist der Pseudo-Code der rekursiven
SQL-Abfrage. Lassen Sie uns tiefer eintauchen.
die with
-Klausel
with [Recursive] CTE(user_defined name) AS
Die with
-Klausel von SQL wird am Anfang zusammen mit dem Recursive
-Schlüsselwort von SQL verwendet. Dann wird das Schlüsselwort AS
verwendet, gefolgt vom CTE
, einem benutzerdefinierten Namen.
Diese Syntax von Schlüsselwörtern bildet den Basisfall unserer Abfrage.
CTE
wird allgemeiner Tabellenausdruck
genannt, eine temporär benannte Ergebnismenge, die vom Benutzer definiert wird, um später in einer nachfolgenden SELECT
-Anweisung verwendet zu werden.
die Basisabfrage
SELECT query (Non Recursive query or the Base query)
Dies ist die erste der beiden Abfragen, die als Basisabfrage bezeichnet werden. Es handelt sich um eine nicht rekursive Abfrage, und hier wird die Basiseingabe bereitgestellt, auf deren Grundlage die Rekursion erfolgen würde.
die Union
-Klausel
UNION
Der Operator Union
wird in der Mitte verwendet, um unsere erste und zweite Abfrage zusammenzuführen.
die rekursive Abfrage
SELECT query (recursive query using the name [with a termination condition])
Dies ist die rekursive
Abfrage, bei der wir die CTE
-Tabelle bereitstellen müssen, die wir zuvor mit der with
-Klausel erstellt haben, und auch die Beendigungsbedingung bereitstellen, die, wenn sie wahr wird, die Rekursion beenden würde.
Die Basis- und die rekursive Abfrage werden in die Klammern ()
geschrieben, wie im obigen Pseudocode gezeigt.
SELECT * from CTE_name
Diese Abfrage zeigt die Tabelle an, die mit dieser rekursiven Technik erstellt wurde.
Implementieren Sie eine rekursive
Abfrage in MySQL
Lassen Sie uns die Funktionsweise dieser Abfrage verstehen, indem wir sie richtig implementieren.
with recursive number_printer AS
(
SELECT 1 AS digit
UNION
SELECT digit+1 FROM number_printer WHERE digit<5
)
SELECT * FROM number_printer
Die obige Tabelle ist das Ergebnis unserer Programmausführung. So wurde es ausgeführt.
Die Abfrage beginnt mit der Klausel with
und dem Schlüsselwort recursive
, und wir haben print_number
als CTE verwendet. Sobald wir den Code ausführen, sucht das Programm nach einem Basisfall, da es versteht, dass es sich um eine rekursive Abfrage handelt.
In der Basisabfrage haben wir den Basisfall bei 1
begonnen, und der hier verwendete Alias ist Ziffer
. In der ersten Iteration der Ausführung ist die Ausgabe das Ergebnis, das von der Basisabfrage zurückgegeben wird.
Die anfänglichen Datensätze wären die Ausgabe der Basisabfrage.
Das von der Basisabfrage zurückgegebene Ergebnis wird zur Eingabe für die rekursive Abfrage. In der zweiten Iteration verwendet die rekursive Abfrage die Ausgabedaten der vorherigen Abfrage und prüft die Beendigungsbedingung.
Wenn die Abbruchbedingung erfüllt ist, stoppt die Iteration; andernfalls tritt es in die dritte Iteration ein. Die dritte Iteration verwendet die in der zweiten Iteration zurückgegebene Ausgabe als Eingabe.
Dies ist die einzige Logik, auf deren Grundlage eine Rekursion erfolgt.
Die dritte Iteration wird ausgeführt und die resultierende Ausgabe dieser Iteration wird als Eingabe für die vierte Iteration verwendet. Die vierte Iteration fügt dann die Ausgabe der Basisabfrage mit ihrer Eingabe hinzu.
Dies geschieht rekursiv, bis eine Beendigungsbedingung erfüllt ist.
Von besonderer Bedeutung ist hier die Tabelle number_printer
. Es ist zwingend erforderlich, die Tabelle zu verwenden, um diese Abfrage rekursiv zu machen. Zum Abschluss der Abfrage wird die Abbruchbedingung mit der WHERE
-Klausel geschrieben.
Lassen Sie uns nun ein weiteres Beispiel für die rekursive Abfrage haben.
Beispiel 2: Hierarchie
Angenommen, wir haben eine Organisation mit einer gewissen Hierarchie. Es gibt einen Manager an der Spitze, und zwei Manager stehen unter der direkten Aufsicht dieses Managers, und jeder dieser beiden Manager hat einen Manager unter seiner direkten Aufsicht.
Jetzt haben wir eine Tabelle namens network
mit Spalten wie id
, name
und ManagerID
erstellt. Diese definieren die ID des Mitarbeiters, seinen Namen bzw. seine Manager-ID.
Sie ist in der folgenden Tabelle dargestellt:
In der obigen Tabelle haben wir die Namen und Manager-IDs der Mitarbeiter erhalten, aber wir möchten diesen Managern basierend auf der zuvor besprochenen Hierarchie die Ränge richtig zuweisen. Aus diesem Grund verwenden wir den folgenden Code:
WITH RECURSIVE hierarchy AS
( SELECT id, name, 1 AS level FROM network WHERE id = 1
UNION
SELECT n.id, n.name, h.level+1 FROM hierarchy h
JOIN network n on h.id = n.ManagerID
)
SELECT * FROM hierarchy
Der obige rekursive Abfragecode würde das Problem wie gewünscht lösen. Lassen Sie uns eintauchen und verstehen, was dieser Code tut.
Die With
-Klausel wird zusammen mit dem Recursive
-Schlüsselwort gemäß der Syntax verwendet, und das CTE
heisst hier hierarchy
.
In der Basisabfrage wählt es die id
und name
aus der network
-Tabelle aus und ruft den Wert mit id
gleich 1
ab. Dann setzt es seinen Wert AS
level
auf integer 1
.
Die Ebene
wird hier verwendet, um die Position der Führungskraft in der Hierarchie darzustellen.
Wir sind mit der Basisabfrage fertig; Jetzt führt der Code die Basisabfrage mit der rekursiven Abfrage unter Verwendung der UNION
-Klausel zusammen.
Die rekursive Abfrage wählt id
und name
aus der network
-Tabelle aus. Das n
hier ist ein Alias für die network
-Tabelle, und was dieser Punkt (.
) hier tut, ist, dass er den Wert begrenzt, der aus der spezifischen Tabelle abgerufen werden soll, die wir davor als Eingabe angeben.
h
ist ein Alias für die hierarchy
-Tabelle, und die Klausel level+1
stellt sicher, dass 1
zu dem ganzzahligen Wert hinzugefügt wird, der aus der hierarchy
-Tabelle abgerufen wird.
Dieser Teil der rekursiven Abfrage nimmt name
und id
aus der network
-Tabelle, der ganzzahlige Wert kommt aus hierarchy
, die Addition von 1
erfolgt und die Ausgabe wird in level
gespeichert. . Diese Abfrage aktualisiert und definiert die Ebene der Manager.
Im nächsten Teil einer Abfrage wird die Klausel JOIN
verwendet, die standardmäßig als Inner join
fungiert. Hier wird die ManagerID
aus der network
-Tabelle mit der id
aus der hierarchy
-Tabelle abgeglichen und mit der obigen Abfrage innerlich verbunden.
Die Logik ist, dass, wenn die Manager-ID mit der ID abgeglichen wird, die Ebene dieser Entität zugewiesen wird, indem 1 zur Ebene des Managers hinzugefügt wird. Auf diese Weise wird der Rang der Aufsicht vergeben.
Haider specializes in technical writing. He has a solid background in computer science that allows him to create engaging, original, and compelling technical tutorials. In his free time, he enjoys adding new skills to his repertoire and watching Netflix.
LinkedIn