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用它来实现伪列和压痕对我来说并不那么重要
LEVEL
developerWorks网站上有一篇文章将端口CONNECT BY转换为DB2,该文章进行了很好的转换。在Explain Extended(Quassnoi的博客)上也有一篇有趣的文章,显示了CONNECT BY和递归CTE之间的一些区别:邻接表与嵌套集:Oracle,基于行和基于集。他还有一篇不错的文章,内容涉及“ SQL Server:递归CTE是否真的基于集?”。似乎“ Oracle中的递归CTE也未设置”。我希望这有助于进行JOOQ的转换,递归,并了解SQL递归的两种实现的区别。
问候,JJ。