Подключение по или иерархическим запросам в СУБД, отличных от Oracle
Oracle поставляется с очень удобной функцией. Вы можете создавать иерархические запросы (рекурсивное поведение), используя следующее предложение:
CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]
как описано здесь:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm
мне интересно, есть ли другие установленные СУБД, которые поддерживают аналогичные синтаксис? Или рекурсивное поведение, подобное этому, может быть в целом смоделировано с помощью регулярных В SQL?
хороший пример, который я хотел бы смоделировать, это (взято из документации Oracle):
SELECT LPAD(' ', 2 * (LEVEL-1)) || last_name org_chart,
employee_id, manager_id, job_id
FROM employees
START WITH job_id = 'AD_VP'
CONNECT BY PRIOR employee_id = manager_id;
в результате:
ORG_CHART EMPLOYEE_ID MANAGER_ID JOB_ID
------------------ ----------- ---------- ----------
Kochhar 101 100 AD_VP
Greenberg 108 101 FI_MGR
Faviet 109 108 FI_ACCOUNT
Chen 110 108 FI_ACCOUNT
Sciarra 111 108 FI_ACCOUNT
Urman 112 108 FI_ACCOUNT
Popp 113 108 FI_ACCOUNT
Whalen 200 101 AD_ASST
Mavris 203 101 HR_REP
Baer 204 101 PR_REP
Higgins 205 101 AC_MGR
Gietz 206 205 AC_ACCOUNT
De Haan 102 100 AD_VP
Hunold 103 102 IT_PROG
Ernst 104 103 IT_PROG
Austin 105 103 IT_PROG
Pataballa 106 103 IT_PROG
Lorentz 107 103 IT_PROG
на LEVEL
псевдо столбец и отступ, достигнутый с ним, не так важны для меня
3 ответов
есть статья на сайте developerworks Port CONNECT BY to DB2 это делает хорошее преобразование. Также Интересная статья об Explain Extended (блог Quassnoi), которая показывает некоторую разницу между CONNECT BY и рекурсивным CTE:список смежности против вложенных наборов: Oracle, на основе строк и на основе набора. У него также есть хорошая статья о " SQL Server: действительно ли рекурсивный CTE основан на множестве?". Похоже, что " рекурсивный CTE в Oracle также не установлен основывающийся." Я надеюсь, что это поможет с преобразованием, рекурсией в JOOQ и пониманием разницы обеих реализаций рекурсии в SQL.
с уважением, ДжейДжей.
SQL Server использует общие табличные выражения (С заявлением) для достижения того же (см. Рекурсивные Запросы С Использованием Общих Табличных Выражений).
этот вид запроса также может использоваться в Oracle (начиная с 11g, если я не ошибаюсь).
результирующий запрос более сложный:
WITH emp(employee_id, manager_id, job_id, last_name, lvl)
AS (
SELECT e.employee_id, e.manager_id, e.job_id, e.last_name, 1 lvl
FROM employees e
WHERE job_id = 'AD_VP'
UNION ALL
SELECT e.employee_id, e.manager_id, e.job_id, e.last_name, r.lvl + 1 lvl
FROM employees e
JOIN emp r ON r.employee_id = e.manager_id
)
SELECT LPAD(' ', 2 * (lvl-1)) || last_name org_chart,
employee_id, manager_id, job_id
FROM emp;
трал через SO показал следующие вопросы и ответы, которые касаются иерархических запросов по различным базам данных. Последний из них относится к MySql resource, что дает общий подход SQL.
построение графа зависимостей таблицы с рекурсивным запросом
создание дерева на основе глубины из Иерархические данные в MySQL (без CTEs)