278
Chapitre 8. Optimisation du code SQL
WHERE id <= Len(' ' + Phrase + ' ') AND SubString(' ' + Phrase + ' ' , id - 1, 1)
= ' '
Cette requête place chaque mot rencontré dans la citation sur une nouvelle
ligne, dans la colonne mots. Elle se base sur une jointure avec une table de nombres,
que nous avons ici générée à la volée. Une table de nombre est toujours utile, faitesen une, à l’aide de ROW_NUMBER(). Pour plus de précision sur cette méthode de découpage, lisez cet article : http://www.sqlteam.com/article/parsing-csv-values-into-multiple-rows.
Un autre besoin courant est de produire des totaux cumulés. Cette opération
peut être plus rapide effectuée par un curseur que par une requête ensembliste, c’est
donc un contre-exemple 1 . Le code ensembliste est à essayer toutefois sur des petits
totaux cumulés. Voici un exemple de code :
SELECT
th1.TransactionID,
th1.ActualCost,
SUM(th2.ActualCost) AS TotalCumule
FROM Production.TransactionHistory th1
JOIN Production.TransactionHistory th2 ON th2.TransactionID <= th1.TransactionID
AND th2.TransactionDate = '20030901'
WHERE th1.TransactionDate = '20030901'
GROUP BY th1.TransactionID, th1.ActualCost
ORDER BY th1.TransactionID
Récursivité
Avant SQL Server 2005, la récursivité ensembliste n’était pas possible (en tout cas
sur des recherches récursives dont on ne connaissait pas la profondeur). L’expression
de table (Common Table Expression, CTE) résout ce problème. Exemple d’appel
récursif pour descendre dans une hiérarchie classique employé/manager :
WITH employeeCTE AS
(
SELECT e.EmployeeId, c.FirstName, c.LastName, 1 as niveau,
CAST(N'lui-même' as nvarchar(100)) as boss
FROM HumanResources.Employee e
JOIN Person.Contact c ON e.ContactID = c.ContactID
WHERE e.ManagerID IS NULL
UNION ALL
SELECT e.EmployeeId, c.FirstName, c.LastName, niveau + 1,
CAST(m.FirstName + ' ' + m.LastName as nvarchar(100))
FROM HumanResources.Employee e
JOIN Person.Contact c ON e.ContactID = c.ContactID
JOIN employeeCTE m ON m.EmployeeId = e.ManagerId
)
SELECT FirstName, LastName, niveau, boss FROM EmployeeCTE;
1. Voir cette entrée de blog d’Adam Machanic, dont l’exemple de code est tiré : http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/running-sums-redux.aspx
Précédent

- 290/334

Suivant