2

我目前正在将 SQL Server SQL 语句翻译成它们的 ANSI 通用等效语句,并且我坚持使用 WITH 语句的递归语句。

为了集中讨论这个问题,我将问题简化如下

如果我有两张桌子

  1. 报告单位

    • 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
  • 设施 F3 有一个父报告单元 R1.2.1
  • 设施 F4 有一个父报告单元 R1.2.2

请记住,ReportingUnit 表中可能有 0 .. n 级递归,如果给定参数 ReportingUnit=R1,我如何从 SQL 语句中返回所有 4 个工具?

4

2 回答 2

3

我可以肯定的是,SQL-92 中没有递归语句。支持的最早版本是 SQL-99。

因此,您无法使用 SQL-92。为什么你认为 SQL-92 是可取的?它是作为 SQL 功能的基本级别,还是有其他原因?

当前版本的 DB2 具有 WITH 子句并且可以实现递归查询。我相信 Oracle 也有 WITH 子句;我不确定它是否可以使用它们实现递归查询。Oracle 还具有完全非标准和非关系的 CONNECT BY PRIOR。我不确定 MS SQL Server 支持什么。

您很有可能无法找到您指定的所有三个 DBMS 都支持的单一语法。

于 2008-11-24T04:15:35.467 回答
2

递归查询没有 SQL-92 解决方案。

最好的选择是使用其中一种编码层次关系的解决方案,以便您可以使用标准 SQL 查询所有后代或祖先。

请参阅此处的简短描述:“将平面表解析为树的最有效/优雅的方法是什么? ”。

或者阅读Joe Celko的“Smarties 中的树和层次结构”。

于 2008-11-24T06:52:11.733 回答