Cet article explique comment les expressions de table (CTES) courantes en SQL simplifient les requêtes complexes. Les CTES améliorent la lisibilité et la maintenabilité en décomposant de grandes requêtes en parties plus petites et nommées. L'article détaille les avantages du CTE sur les sous-requêtes, Dem
Les expressions de table courantes (CTES) sont temporaires, nommées ensembles de résultats qui existent dans la portée d'exécution d'une seule instruction SQL. Ils sont définis à l'aide de la WITH
avec la définition du CTE, puis de la requête principale qui utilise le CTE. Cela vous permet de décomposer une requête complexe en parties plus petites et plus gérables, d'améliorer la lisibilité et la maintenabilité.
Illustrons avec un exemple. Supposons que vous ayez deux tables: Orders
et Customers
. Vous souhaitez trouver toutes les commandes passées par les clients d'une ville spécifique, dites «Londres». Une requête complexe sans CTES pourrait ressembler à ceci:
<code class="sql">SELECT o.OrderID, o.OrderDate, c.CustomerID, c.CustomerName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID WHERE c.City = 'London';</code>
À l'aide d'un CTE, nous pouvons simplifier ceci:
<code class="sql">WITH LondonCustomers AS ( SELECT CustomerID FROM Customers WHERE City = 'London' ) SELECT o.OrderID, o.OrderDate, c.CustomerID, c.CustomerName FROM Orders o JOIN Customers c ON o.CustomerID = c.CustomerID WHERE c.CustomerID IN (SELECT CustomerID FROM LondonCustomers);</code>
Le LondonCustomers
CTE sélectionne tous les clients de Londres. La requête principale utilise ensuite ce CTE pour filtrer les commandes. Cette approche est plus claire et plus facile à comprendre que l'approche d'origine unique, en particulier pour des requêtes plus complexes impliquant plusieurs jointures et filtres. Le CTE modulalise efficacement la requête, ce qui facilite le débogage et le maintien.
Bien que les CTES et les sous-requêtes puissent obtenir des résultats similaires, les CTES offrent plusieurs avantages:
Absolument! Les CTES améliorent considérablement la lisibilité et la maintenabilité du code SQL, en particulier pour les requêtes complexes. En décomposant une grande requête en unités logiques plus petites, les CTES améliorent la structure globale et l'organisation du code. Cela facilite la compréhension de la logique de la requête, d'identifier les erreurs et d'apporter des modifications. L'utilisation de noms descriptives pour CTES améliore encore la lisibilité, permettant aux développeurs de saisir rapidement l'objectif de chaque partie de la requête. Cela conduit à une réduction du temps de développement, à moins d'erreurs et à une collaboration plus facile entre les membres de l'équipe.
Les CTES récursives sont un outil puissant pour gérer les données hiérarchiques, telles que les graphiques organisationnels, la note de matériaux ou les systèmes de fichiers. Ils vous permettent de traverser une structure hiérarchique en se référant à plusieurs reprises dans la définition du CTE.
La structure d'un CTE récursive implique deux parties:
Voyons un exemple d'un tableau organisationnel:
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( -- Anchor member: Select the top-level employees SELECT EmployeeID, ManagerID, EmployeeName, Level = 0 FROM Employees WHERE ManagerID IS NULL UNION ALL -- Recursive member: Join the CTE to itself to get subordinates SELECT e.EmployeeID, e.ManagerID, e.EmployeeName, eh.Level 1 FROM Employees e INNER JOIN EmployeeHierarchy eh ON e.ManagerID = eh.EmployeeID ) SELECT * FROM EmployeeHierarchy;</code>
Ce CTE récursif commence par les employés de niveau supérieur (ceux qui sans gestionnaires). Le membre récursif rejoint ensuite le tableau CTE à la table Employees
pour trouver les subordonnés de chaque employé, augmentant le Level
de chaque niveau de la hiérarchie. Cela se poursuit jusqu'à ce que tous les employés soient inclus dans l'ensemble de résultats. Le UNION ALL
les résultats de l'ancre et des membres récursifs. La colonne Level
aide à visualiser la structure hiérarchique. Le WHERE ManagerID IS NULL
dans le membre de l'ancre garantit que seuls les employés de haut niveau sont inclus dans la sélection initiale. Il s'agit d'une partie cruciale pour éviter une récursivité infinie. N'oubliez pas d'avoir toujours une condition de terminaison claire pour empêcher les boucles infinies.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!