一尘不染

除Oracle以外的RDBMS中的CONNECT BY或分层查询

sql

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用它来实现伪列和压痕对我来说并不那么重要


阅读 169

收藏
2021-03-10

共1个答案

一尘不染

developerWorks网站上有一篇文章将端口CONNECT
BY
转换为DB2,该文章进行了很好的转换。在Explain
Extended(Quassnoi的博客)上也有一篇有趣的文章,显示了CONNECT
BY和递归CTE之间的一些区别:邻接表与嵌套集:Oracle,基于行和基于集。他还有一篇不错的文章,内容涉及“ SQL
Server:递归CTE是否真的基于集?”。似乎“
Oracle中的递归CTE也未设置”。我希望这有助于进行JOOQ的转换,递归,并了解SQL递归的两种实现的区别。

问候,JJ。

2021-03-10