Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Simulazione di CONNECT BY PRIOR di Oracle in SQL Server

Il modo standard SQL per implementare le query ricorsive, implementato ad es. di IBM DB2 e SQL Server, è il WITH clausola. Consulta questo articolo per un esempio di traduzione di un CONNECT BY in un WITH (tecnicamente un CTE ricorsivo ) -- l'esempio è per DB2 ma credo che funzionerà anche su SQL Server.

Modifica:a quanto pare il querant originale richiede un esempio specifico, eccone uno dal sito IBM il cui URL ho già fornito. Data una tabella:

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

dove mgrid fa riferimento a empid del manager di un dipendente , il compito è ottenere i nomi di tutti coloro che segnalano direttamente o indirettamente a Joan . In Oracle, è un semplice CONNECT :

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

In SQL Server, IBM DB2 o PostgreSQL 8.4 (così come nello standard SQL, per quel che vale;-), la soluzione perfettamente equivalente è invece una query ricorsiva (sintassi più complessa, ma, in realtà, ancora più potenza e flessibilità ):

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 di Oracle diventa la prima SELECT nidificata , il caso base della ricorsione, deve essere UNION ed con la parte ricorsiva che è solo un altro SELECT .

La versione specifica di WITH di SQL Server è ovviamente documentato su MSDN, che fornisce anche linee guida e limitazioni per l'utilizzo di questa parola chiave, oltre a diversi esempi.