La méthode standard SQL pour implémenter des requêtes récursives, telle qu'implémentée par ex. par IBM DB2 et SQL Server, est le WITH
clause. Voir cet article pour un exemple de traduction d'un CONNECT BY
dans un WITH
(techniquement un CTE récursif ) -- l'exemple est pour DB2 mais je pense que cela fonctionnera également sur SQL Server.
Edit:apparemment, le demandeur d'origine nécessite un exemple spécifique, en voici un du site IBM dont j'ai déjà donné l'URL. Étant donné une table :
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
où mgrid
fait référence à l'empid
du responsable d'un employé , la tâche consiste à obtenir les noms de tous ceux qui relèvent directement ou indirectement de Joan
. Dans Oracle, c'est un simple CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
Dans SQL Server, IBM DB2, ou PostgreSQL 8.4 (ainsi que dans le standard SQL, pour ce que ça vaut;-), la solution parfaitement équivalente est plutôt une requête récursive (syntaxe plus complexe, mais, en réalité, encore plus de puissance et de flexibilité ):
WITH n(empid, name) AS
(SELECT empid, name
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT nplus1.empid, nplus1.name
FROM emp as nplus1, n
WHERE n.empid = nplus1.mgrid)
SELECT name FROM n
START WITH
d'Oracle la clause devient le premier SELECT
imbriqué , le cas de base de la récursivité, soit UNION
ed avec la partie récursive qui est juste un autre SELECT
.
Version spécifique de SQL Server de WITH
est bien sûr documenté sur MSDN, qui donne également des indications et des limitations pour l'utilisation de ce mot-clé, ainsi que plusieurs exemples.