簡體   English   中英

除Oracle之外的RDBMS中的CONNECT BY或分層查詢

[英]CONNECT BY or hierarchical queries in RDBMS other than Oracle

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偽列和用它實現的縮進對我來說並不那么重要

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;

developerWorks站點上的一篇關於DB2 CONNECT BY到DB2的文章進行了很好的轉換。 還有一篇關於Explain Extended(Quassnoi的博客)的有趣文章,它顯示了CONNECT BY和遞歸CTE之間的一些區別: 鄰接列表與嵌套集:Oracle ,基於行和基於集合。 他還有一篇很好的文章關於“SQL Server:遞歸CTE是否真的基於集合?”。 似乎“Oracle中的遞歸CTE也沒有基於設置”。 我希望這有助於JOOQ中的轉換,遞歸和理解SQL中遞歸的兩種實現的差異。

此致,JJ。

通過SO的拖網顯示了以下問題和答案,這些問題和答案涉及各種數據庫的分層查詢。 最后一個是指MySql資源 ,它提供了一種通用的SQL方法。

使用遞歸查詢構建表依賴關系圖

在SQL中遞歸選擇

SQL遞歸查詢

從MySQL中的分層數據生成基於深度的樹(無CTE)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM