Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Simulação de CONNECT BY PRIOR do Oracle no SQL Server


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.