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