Standardní způsob SQL pro implementaci rekurzivních dotazů, jak je implementován např. od IBM DB2 a SQL Server, je WITH
doložka. V tomto článku najdete jeden příklad překladu CONNECT BY
do WITH
(technicky rekurzivní CTE ) -- příklad je pro DB2, ale věřím, že bude fungovat i na SQL Serveru.
Edit:zřejmě původní querant vyžaduje konkrétní příklad, zde je jeden ze stránek IBM, jejichž URL jsem již uvedl. Daná tabulka:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
kde mgrid
odkazuje na empid
manažera zaměstnance , úkolem je získat jména všech, kteří se přímo nebo nepřímo hlásí Joan
. V Oracle je to jednoduchý CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
V SQL Server, IBM DB2 nebo PostgreSQL 8.4 (stejně jako ve standardu SQL, za co to stojí;-) je dokonale ekvivalentní řešení místo toho rekurzivní dotaz (složitější syntaxe, ale ve skutečnosti ještě větší výkon a flexibilita ):
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 START WITH
klauzule se stane prvním vnořeným SELECT
, základní případ rekurze, být UNION
ed s rekurzivní částí, která je jen dalším SELECT
.
Specifická varianta WITH
pro SQL Server je samozřejmě zdokumentováno na webu MSDN, kde jsou také uvedeny pokyny a omezení pro použití tohoto klíčového slova a také několik příkladů.