2008-11-24 61 views
1

我正在將SQL Server SQL語句翻譯成其目前的ANSI通用等效語句,並且使用WITH語句阻塞了遞歸語句。ANSI 92遞歸SQL語句要求

對於專注於問題的緣故,如下

如果我有兩個表

  1. ReportingUnit

    • COL1我會簡化問題:關鍵
    • col2:ParentReportingUnitKey
  2. 設施

    • COL1:重點
    • COL2:ParentReportingUnitKey

這種結構被描述報告單位下降到工廠,其中一個報告單位的層次結構可能有0·1個直接家長報告單位和0·n個兒童報告單位。

設施是一個'葉'記錄,鏈接到報告單位。

我需要編寫一個ANSI 92有效的SQL語句(或者最壞的一個可以在Oracle,DB2和SQL Server上運行的語句),它將返回與給定報告單元相關的所有設施。

例如

  • ReportingUnit R1已經ReportingUnit孩子R1.1和R1.2
  • ReportingUnit R1.1有孩子R1.1.1,R1.1.2
  • ReportingUnit R1.2有孩子R1.2.1,R1 2.2

  • 設施F1有一個父報告單位R1.1.1

  • 設施F2有父報告單位R1.1.2
  • 發基lity F3有父報告單位R1.2.1
  • 設施F4有父報告單位R1.2.2

銘記有可能是0 .. N的ReportingUnit表遞歸的水平,怎麼能在給定參數ReportingUnit = R1的情況下,我從SQL語句返回所有4個設施?

回答

3

我可以肯定地確定在SQL-92中沒有可用的遞歸語句;最早支持的版本是SQL-99。

因此,你堅持不使用SQL-92。你爲什麼認爲SQL-92是可取的?它是作爲SQL功能的基礎級別,還是有其他原因?

當前版本的DB2具有WITH子句並可以實現遞歸查詢。我相信Oracle也有WITH條款;我不確定它是否可以使用它們實現遞歸查詢。 Oracle還具有完全非標準和非關係的CONNECT BY PRIOR。我不確定MS SQL Server支持什麼。

有一個相當強的機會,您將無法找到所有三個指定的DBMS支持的單一語法。

2

對於遞歸查詢沒有SQL-92解決方案。

最好的選擇是使用解決方案之一來編碼層次關係,以便您可以使用標準SQL查詢所有後代或祖先。

在此處查看簡要說明:「What is the most efficient/elegant way to parse a flat table into a tree?」。

或閱讀Joe Celko的「Trees and Hierarchies in SQL for Smarties」。

+0

+1。嵌套集是在SQL中執行任意深度層次結構的方式;父行外鍵幾乎永遠不是可用的解決方案。 – bobince 2008-11-24 13:38:02