/ / Récursion vs expression de table commune - quand utiliser CTE? - sql, récursivité, expression de table commune, requête récursive

Récurrence vs expression de table commune - quand utiliser CTE? - sql, récursivité, expression de table commune, requête récursive

Étant donné le schéma de tableau suivant, on m'a demandé comment trouver tous les subordonnés d'Annie.

-----------------------------
EmployeeId | Name | ManagerId
-----------------------------
1          | Annie| NULL
2          | Ben  | 1
3          | Carl | 2
4          | Den  | 1
....

Venant de l’ORM et du fond côté serveur, j’aiécrivez une fonction récursive pour résoudre le problème. Cependant, on m'a dit qu'il y avait une manière différente d'utiliser le CTE. Pourquoi et quand utilisons-nous le CTE? Pourquoi pas la récursion? CTE est-il plus rapide que la récursivité?

Quoi qu'il en soit, voici ma mise en œuvre récursive:

public class Employee{
int employeeId;
string name;
public List<Employee> managers {get;set};
public List<Employee> subordinates {get;set};
}

//find direct & non-direct reports
public List<Employee> getSubordinates(Employee emp) {
List<Employee> reports = new List<Employee>();
if (emp.subordinates == null || emp.subordinates.Count == 0)
return null;

foreach(Employee e in emp.subordinates) {
reports.AddRange(getSubordinates(e));
}

return reports.DistinctBy(x=>x.employeeId);
}

Réponses:

0 pour la réponse № 1

Common Table Expressions (CTE) vous aiderait accomplir la récursion Du côté de la base de données, vous feriez vraiment la même chose que votre méthode, à l’exception de ce qu’elle fait avec une requête SQL, par exemple:

WITH subordinates AS (
SELECT e.EmployeeId, e.Name
FROM dbo.Employee e
WHERE e.ManagerId = 1
UNION ALL
SELECT e.EmployeeId, e.Name
FROM dbo.Employee e
INNER JOIN subordinates s ON s.EmployeeId = e.ManagerId
)
SELECT s.EmployeeId, s.Name
FROM subordinates s;

L'avantage est que cela est potentiellement plus rapide car cela se fait dans une requête par rapport à plusieurs requêtes générées à partir de la méthode ORM récursive.

Exemple de violon T-SQL