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.