sql >> Base de Datos >  >> RDS >> Sqlserver

Simulación de CONNECT BY PRIOR de Oracle en SQL Server

La forma estándar de SQL para implementar consultas recursivas, como se implementó, p. por IBM DB2 y SQL Server, es el WITH cláusula. Consulte este artículo para ver un ejemplo de cómo traducir un CONNECT BY en un WITH (técnicamente un CTE recursivo ) -- el ejemplo es para DB2 pero creo que también funcionará en SQL Server.

Editar:aparentemente, la consulta original requiere un ejemplo específico, aquí hay uno del sitio de IBM cuya URL ya di. Dada una tabla:

CREATE TABLE emp(empid  INTEGER NOT NULL PRIMARY KEY,
                 name   VARCHAR(10),
                 salary DECIMAL(9, 2),
                 mgrid  INTEGER);

donde mgrid hace referencia al empid del gerente de un empleado , la tarea es obtener los nombres de todas las personas que reportan directa o indirectamente a Joan . En Oracle, eso es un simple CONNECT :

SELECT name 
  FROM emp
  START WITH name = 'Joan'
  CONNECT BY PRIOR empid = mgrid

En SQL Server, IBM DB2 o PostgreSQL 8.4 (así como en el estándar SQL, por lo que vale;-), la solución perfectamente equivalente es en cambio una consulta recursiva (sintaxis más compleja, pero, en realidad, aún más poder y flexibilidad ):

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 de Oracle la cláusula se convierte en el primer SELECT anidado , el caso base de la recursividad, para ser UNION ed con la parte recursiva que es solo otro SELECT .

El sabor específico de SQL Server de WITH por supuesto, está documentado en MSDN, que también brinda pautas y limitaciones para usar esta palabra clave, así como varios ejemplos.