Стандартный способ SQL для реализации рекурсивных запросов, например, реализованный. IBM DB2 и SQL Server , это предложение WITH
. В этой статье приведен пример перевода CONNECT BY
в WITH
(технически рекурсивный CTE ) - пример для DB2, но я считаю, что он будет работать на SQL Сервер также.
Редактировать: очевидно, оригинальный оригинал требует конкретного примера, вот один из сайта 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
Предложение Oracle START WITH
становится первым вложенным SELECT
, базовым случаем рекурсии, для UNION
редактирования с рекурсивной частью, которая является просто другой SELECT
.
Специфический вариант SQL Server WITH
, конечно, задокументирован в MSDN , в котором также приведены рекомендации и ограничения по использованию этого ключевого слова, а также несколько примеров.