Nunca uso CTE con recursividad. Estaba leyendo un artículo al respecto. Este artículo muestra la información de los empleados con la ayuda del servidor SQL CTE y la recursividad. Básicamente, muestra información a los empleados y a su gerente. No puedo entender cómo funciona esta consulta. Aquí está la consulta:
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
Aquí estoy publicando sobre cómo se muestra la salida:
Solo necesito saber cómo se muestra al gerente primero y luego a su subordinado en un bucle. Supongo que la primera declaración SQL se activa solo una vez y devuelve todos los ID de empleado.
Y la segunda consulta se dispara repetidamente, consultando la base de datos en la que existe el empleado con la identificación del gerente actual.
Explique cómo se ejecuta la instrucción sql en un bucle interno y también dígame el orden de ejecución de SQL. Gracias.
MI 2da fase de pregunta
;WITH Numbers AS
(
SELECT n = 1
UNION ALL
SELECT n + 1
FROM Numbers
WHERE n+1 <= 10
)
SELECT n
FROM Numbers
P 1) ¿cómo se incrementa el valor de N? si el valor se asigna a N cada vez, entonces el valor N se puede incrementar, pero solo la primera vez que se inicializó el valor N.
P 2) CTE y recursividad de relaciones laborales:
En el momento en que agrego dos gerentes y agrego algunos empleados más bajo el segundo gerente, es donde comienza el problema.
Quiero mostrar el primer detalle del gerente y en las siguientes filas solo los detalles del empleado que se relacionan con el subordinado de ese gerente.
Suponer
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
Quiero mostrar los resultados de esa manera con expresiones CTE. Por favor, dígame qué modificar en mi sql que di aquí para extraer las relaciones gerente-empleado. Gracias.
Quiero que la salida sea así:
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
Es posible...?
Me gustaría esbozar un breve paralelo semántico a una respuesta ya correcta.
En términos 'simples', un CTE recursivo se puede definir semánticamente como las siguientes partes:
1: la consulta CTE. También conocido como ANCHOR.
2: La consulta CTE recursiva en el CTE en (1) con UNION ALL (o UNION o EXCEPT o INTERSECT) por lo que el resultado final se devuelve en consecuencia.
3: La condición de esquina / terminación. Que es por defecto cuando no hay más filas / tuplas devueltas por la consulta recursiva.
Un breve ejemplo que aclarará la imagen:
Explicación: La primera consulta CTE devuelve los proveedores base (como hojas) que no suministran a ningún otro proveedor directamente (-1)
La consulta recursiva en la primera iteración obtiene todos los proveedores que suministran a los proveedores devueltos por ANCHOR. Este proceso continúa hasta que la condición devuelve tuplas.
UNION ALL devuelve todas las tuplas sobre el total de llamadas recursivas.
Otro buen ejemplo se puede encontrar aquí .
PD: Para que funcione un CTE recursivo, las relaciones deben tener una condición jerárquica (recursiva) para trabajar. Ej: elementId = elementParentId .. entiendes el punto.
fuente
El proceso de ejecución es realmente confuso con CTE recursivo, encontré la mejor respuesta en https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx y el resumen del proceso de ejecución de CTE es el siguiente.
La semántica de la ejecución recursiva es la siguiente:
fuente
fuente