Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Simulation de CONNECT BY PRIOR d'Oracle dans SQL Server

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);

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.