Ich benutze CTE nie mit Rekursion. Ich habe gerade einen Artikel darüber gelesen. Dieser Artikel zeigt Mitarbeiterinformationen mit Hilfe von SQL Server CTE und Rekursion. Grundsätzlich werden Mitarbeiter und deren Managerinformationen angezeigt. Ich kann nicht verstehen, wie diese Abfrage funktioniert. Hier ist die Abfrage:
WITH
cteReports (EmpID, FirstName, LastName, MgrID, EmpLevel)
AS
(
SELECT EmployeeID, FirstName, LastName, ManagerID, 1
FROM Employees
WHERE ManagerID IS NULL
UNION ALL
SELECT e.EmployeeID, e.FirstName, e.LastName, e.ManagerID,
r.EmpLevel + 1
FROM Employees e
INNER JOIN cteReports r
ON e.ManagerID = r.EmpID
)
SELECT
FirstName + ' ' + LastName AS FullName,
EmpLevel,
(SELECT FirstName + ' ' + LastName FROM Employees
WHERE EmployeeID = cteReports.MgrID) AS Manager
FROM cteReports
ORDER BY EmpLevel, MgrID
Hier poste ich darüber, wie die Ausgabe angezeigt wird:
Ich muss nur wissen, wie es zuerst den Manager und dann seinen Untergebenen in einer Schleife zeigt. Ich denke, die erste SQL-Anweisung wird nur einmal ausgelöst und gibt alle Mitarbeiter-IDs zurück.
Die zweite Abfrage wird wiederholt ausgelöst und fragt die Datenbank ab, in der der Mitarbeiter mit der aktuellen Manager-ID vorhanden ist.
Bitte erläutern Sie, wie die SQL-Anweisung in einer internen Schleife ausgeführt wird, und teilen Sie mir auch die SQL-Ausführungsreihenfolge mit. Vielen Dank.
MEINE 2. Phase der Frage
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
F 1) Wie wird der Wert von N erhöht? Wenn der Wert jedes Mal N zugewiesen wird, kann der N-Wert erhöht werden, aber nur beim ersten Initialisieren des N-Werts.
F 2) CTE und Rekursion der Mitarbeiterbeziehungen:
In dem Moment, in dem ich zwei Manager und ein paar weitere Mitarbeiter unter dem zweiten Manager hinzufüge, beginnt das Problem.
Ich möchte das erste Managerdetail und in den nächsten Zeilen nur die Mitarbeiterdetails anzeigen, die sich auf den Untergebenen dieses Managers beziehen.
Annehmen
ID Name MgrID Level
--- ---- ------ -----
1 Keith NULL 1
2 Josh 1 2
3 Robin 1 2
4 Raja 2 3
5 Tridip NULL 1
6 Arijit 5 2
7 Amit 5 2
8 Dev 6 3
Ich möchte die Ergebnisse so mit CTE-Ausdrücken anzeigen. Bitte sagen Sie mir, was ich in meinem SQL ändern soll, das ich hier angegeben habe, um die Beziehungen zwischen Manager und Mitarbeiter zu verbessern. Vielen Dank.
Ich möchte, dass die Ausgabe folgendermaßen aussieht:
ID Name MgrID nLevel Family
----------- ------ ----------- ----------- --------------------
1 Keith NULL 1 1
3 Robin 1 2 1
2 Josh 1 2 1
4 Raja 2 3 1
5 Tridip NULL 1 2
7 Amit 5 2 2
6 Arijit 5 2 2
8 Dev 6 3 2
Ist das möglich...?
Ich möchte eine kurze semantische Parallele zu einer bereits korrekten Antwort skizzieren.
In 'einfachen' Begriffen kann ein rekursiver CTE semantisch als die folgenden Teile definiert werden:
1: Die CTE-Abfrage. Auch als ANKER bekannt.
2: Die rekursive CTE-Abfrage auf dem CTE in (1) mit UNION ALL (oder UNION oder EXCEPT oder INTERSECT), sodass das Endergebnis entsprechend zurückgegeben wird.
3: Die Eck- / Beendigungsbedingung. Dies ist standardmäßig der Fall, wenn von der rekursiven Abfrage keine Zeilen / Tupel mehr zurückgegeben werden.
Ein kurzes Beispiel, das das Bild klar macht:
Erläuterung: Die erste CTE-Abfrage gibt die Basislieferanten (wie Blätter) zurück, die nicht direkt an einen anderen Lieferanten liefern (-1).
Die rekursive Abfrage in der ersten Iteration erhält alle Lieferanten, die an die vom ANCHOR zurückgegebenen Lieferanten liefern. Dieser Vorgang wird fortgesetzt, bis die Bedingung Tupel zurückgibt.
UNION ALL gibt alle Tupel über die gesamten rekursiven Aufrufe zurück.
Ein weiteres gutes Beispiel finden Sie hier .
PS: Damit ein rekursiver CTE funktioniert, müssen die Beziehungen eine hierarchische (rekursive) Bedingung haben, an der gearbeitet werden kann. Beispiel: elementId = elementParentId .. Sie erhalten den Punkt.
quelle
Der Ausführungsprozess ist wirklich verwirrend mit rekursivem CTE. Die beste Antwort fand ich unter https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx und der Zusammenfassung des CTE-Ausführungsprozesses ist wie unten.
Die Semantik der rekursiven Ausführung ist wie folgt:
quelle
quelle