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.