De standaard SQL-manier om recursieve query's te implementeren, zoals geïmplementeerd b.v. door IBM DB2 en SQL Server, is de WITH
clausule. Zie dit artikel voor een voorbeeld van het vertalen van een CONNECT BY
in een WITH
(technisch gezien een recursieve CTE ) -- het voorbeeld is voor DB2, maar ik denk dat het ook op SQL Server zal werken.
Bewerken:blijkbaar heeft de oorspronkelijke querant een specifiek voorbeeld nodig, hier is er een van de IBM-site waarvan ik de URL al heb gegeven. Gegeven een tafel:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
waar mgrid
verwijst naar de empid
. van de manager van een werknemer , de taak is om de namen te krijgen van iedereen die direct of indirect rapporteert aan Joan
. In Oracle is dat een simpele CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
In SQL Server, IBM DB2 of PostgreSQL 8.4 (evenals in de SQL-standaard, voor wat dat waard is;-), is de perfect equivalente oplossing in plaats daarvan een recursieve query (complexere syntaxis, maar eigenlijk nog meer kracht en flexibiliteit ):
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
Oracle's START WITH
clausule wordt de eerste geneste SELECT
, het basisgeval van de recursie, te zijn UNION
ed met het recursieve deel dat gewoon een andere SELECT
. is .
SQL Server's specifieke smaak van WITH
is natuurlijk gedocumenteerd op MSDN, dat ook richtlijnen en beperkingen geeft voor het gebruik van dit zoekwoord, evenals verschillende voorbeelden.