Oracle提供了非常方便的功能.您可以使用以下子句创建分层查询(递归行为):
CONNECT BY [NOCYCLE] {condition [AND condition...]} [START WITH condition]
如下所述:
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;
导致:
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伪列和用它实现的缩进对我来说并不那么重要
解决方法
developerworks网站
Port CONNECT BY to DB2上有一篇文章做了很好的转换.
另外一篇关于Explain Extended(Quassnoi的博客)的有趣文章显示了CONNECT BY和递归CTE之间的一些区别: Adjacency list vs. nested sets: Oracle,基于行和基于集合.他还有一篇很好的文章关于“sql Server:递归CTE是否真的基于集合?”.似乎“Oracle中的递归CTE也没有基于设置”.我希望这有助于JOOQ中的转换,递归和理解sql中递归的两种实现的差异.
另外一篇关于Explain Extended(Quassnoi的博客)的有趣文章显示了CONNECT BY和递归CTE之间的一些区别: Adjacency list vs. nested sets: Oracle,基于行和基于集合.他还有一篇很好的文章关于“sql Server:递归CTE是否真的基于集合?”.似乎“Oracle中的递归CTE也没有基于设置”.我希望这有助于JOOQ中的转换,递归和理解sql中递归的两种实现的差异.
问候,JJ.