Je n'utilise jamais CTE avec récursivité. Je lisais juste un article là-dessus. Cet article montre les informations sur les employés à l'aide du serveur SQL CTE et de la récursivité. Il montre essentiellement les employés et leurs informations de manager. Je ne suis pas en mesure de comprendre le fonctionnement de cette requête. Voici la requête:
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
Ici, je poste sur la façon dont la sortie s'affiche:
J'ai juste besoin de savoir comment cela montre d'abord le manager, puis son subordonné en boucle. Je suppose que la première instruction SQL ne se déclenche qu'une seule fois et qui renvoie tous les identifiants d'employés.
Et la deuxième requête se déclenche à plusieurs reprises, interrogeant la base de données sur laquelle l'employé existe avec l'ID de gestionnaire actuel.
Veuillez expliquer comment l'instruction sql s'exécute dans une boucle interne et indiquez-moi également l'ordre d'exécution sql. Merci.
MA 2ème phase de question
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
Q 1) Comment la valeur de N est-elle incrémentée? si la valeur est assignée à N à chaque fois, la valeur N peut être incrémentée mais seulement la première fois que la valeur N a été initialisée.
Q 2) CTE et récursivité des relations de travail:
Le moment où j'ajoute deux managers et que j'ajoute quelques employés supplémentaires sous le second manager, c'est là que le problème commence.
Je souhaite afficher le premier détail du responsable et dans les lignes suivantes uniquement les détails de l'employé qui se rapportent au subordonné de ce responsable.
Supposer
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
Je veux afficher les résultats de cette manière avec des expressions CTE. Veuillez me dire ce qu'il faut modifier dans mon sql que j'ai donné ici afin de tirer les relations manager-employés. Merci.
Je veux que la sortie soit comme ceci:
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
Est-ce possible...?
Voudrait esquisser un bref parallèle sémantique à une réponse déjà correcte.
En termes `` simples '', un CTE récursif peut être défini sémantiquement comme les parties suivantes:
1: La requête CTE. Aussi connu sous ANCHOR.
2: La requête CTE récursive sur le CTE dans (1) avec UNION ALL (ou UNION ou EXCEPT ou INTERSECT) donc le résultat final est renvoyé en conséquence.
3: La condition de coin / terminaison. Ce qui est par défaut lorsqu'il n'y a plus de lignes / tuples renvoyés par la requête récursive.
Un petit exemple qui rendra l'image claire:
Explication: La première requête CTE renvoie les fournisseurs de base (comme les feuilles) qui ne fournissent directement aucun autre fournisseur (-1)
La requête récursive de la première itération obtient tous les fournisseurs qui fournissent aux fournisseurs renvoyés par l'ANCRE. Ce processus continue jusqu'à ce que la condition renvoie des tuples.
UNION ALL renvoie tous les tuples sur le total des appels récursifs.
Un autre bon exemple peut être trouvé ici .
PS: Pour qu'un CTE récursif fonctionne, les relations doivent avoir une condition hiérarchique (récursive) sur laquelle travailler. Ex: elementId = elementParentId .. vous obtenez le point.
la source
Le processus d'exécution est vraiment déroutant avec le CTE récursif, j'ai trouvé la meilleure réponse sur https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx et le résumé du processus d'exécution du CTE est comme ci-dessous.
La sémantique de l'exécution récursive est la suivante:
la source
la source