A maneira padrão SQL de implementar consultas recursivas, conforme implementado, por exemplo pelo IBM DB2 e SQL Server, é o
WITH
cláusula. Veja este artigo para um exemplo de tradução de um CONNECT BY
em um WITH
(tecnicamente um CTE recursivo ) -- o exemplo é para DB2, mas acredito que funcionará no SQL Server também. Edit:aparentemente o querente original requer um exemplo específico, aqui está um do site da IBM cuja URL eu já dei. Dada uma tabela:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
onde
mgrid
faz referência ao empid
do gerente de um funcionário , a tarefa é obter os nomes de todos que se reportam direta ou indiretamente a Joan
. No Oracle, isso é um simples CONNECT
:SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
No SQL Server, IBM DB2 ou PostgreSQL 8.4 (assim como no padrão SQL, pelo que vale;-), a solução perfeitamente equivalente é uma consulta recursiva (sintaxe mais complexa, mas, na verdade, ainda mais poder e flexibilidade ):
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
da Oracle cláusula se torna o primeiro SELECT
aninhado , o caso base da recursão, para ser UNION
ed com a parte recursiva que é apenas outro SELECT
. Sabor específico do SQL Server de
WITH
é claro que está documentado no MSDN, que também fornece diretrizes e limitações para o uso dessa palavra-chave, além de vários exemplos.