Luk*_*der 6 sql oracle simulation connect-by recursive-query
Oracle提供了非常方便的功能.您可以使用以下子句创建分层查询(递归行为):
CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]
Run Code Online (Sandbox Code Playgroud)
如此处所述:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28286/queries003.htm
我想知道,有没有其他已建立的RDBMS支持等效或类似的语法?或者可以使用常规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;
Run Code Online (Sandbox Code Playgroud)
导致:
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
Run Code Online (Sandbox Code Playgroud)
该LEVEL
用它来实现伪列和压痕对我来说并不那么重要
SQL Server使用公用表表达式(WITH语句)来实现相同的功能(请参阅使用公用表表达式的递归查询).
这种查询也可以在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;
Run Code Online (Sandbox Code Playgroud)
小智 4
developerworks 网站上有一篇文章《Port CONNECT BY to DB2》做了很好的转换。\n还有一篇关于Explain Extended(Quassnoi\ 的博客)的有趣文章,展示了 CONNECT BY 和递归 CTE 之间的一些区别:邻接列表与嵌套集: Oracle,基于行和基于集。他还有一篇关于“SQL Server:递归 CTE\xe2\x80\x99s 真的基于集合吗?”的好文章。看来“Oracle中的递归CTE也不是基于集合的”。我希望这有助于 JOOQ 中的转换、递归以及理解 SQL 中递归的两种实现的差异。
\n\n问候,\nJJ。
\n 归档时间: |
|
查看次数: |
6113 次 |
最近记录: |