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.