Стандартният SQL начин за изпълнение на рекурсивни заявки, както е реализиран напр. от IBM DB2 и SQL Server, е WITH
клауза. Вижте тази статия за един пример за превод на CONNECT BY
в WITH
(технически рекурсивен CTE ) -- примерът е за DB2, но вярвам, че ще работи и на SQL Server.
Редактиране:очевидно оригиналният querant изисква конкретен пример, ето един от сайта на IBM, чийто URL вече дадох. Дадена е таблица:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
където mgrid
препраща empid
на мениджъра на служител , задачата е да получите имената на всички, които се отчитат пряко или косвено на Joan
. В Oracle това е просто CONNECT
:
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
В SQL Server, IBM DB2 или PostgreSQL 8.4 (както и в SQL стандарта, за какво струва това;-), идеално еквивалентното решение е вместо това рекурсивна заявка (по-сложен синтаксис, но всъщност още повече мощност и гъвкавост ):
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
на Oracle клаузата става първият вложен SELECT
, основният случай на рекурсията, да бъде UNION
ed с рекурсивната част, която е просто още един SELECT
.
Специфичният вкус на SQL Server на WITH
разбира се е документиран в MSDN, който също дава насоки и ограничения за използването на тази ключова дума, както и няколко примера.