Rekursive MySQL-Abfrage

Haider Ali 15 Februar 2024
  1. MySQL Rekursive Abfrage
  2. Implementieren Sie eine rekursive Abfrage in MySQL
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

Zahlendrucker

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:

Netzwerk

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.

Hierarchie

Autor: Haider Ali
Haider Ali avatar Haider Ali avatar

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