需要ANSI 92递归SQL语句

时间:2008-11-24 04:03:51

标签: sql recursion hierarchical-data ansi-sql ansi-sql-92

我目前正在将SQL Server SQL语句翻译成他们的ANSI通用等价物,并且使用WITH语句使用递归语句。

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

如果我有两张桌子

  1. ReportingUnit

    • col1:Key
    • col2:ParentReportingUnitKey
  2. 设施

    • col1:Key
    • col2:ParentReportingUnitKey
  3. 此结构描述了直到设施的报告单位的层次结构,其中报告单位可以具有0..1直接父报告单位和0 ... n子报告单位。

    设施是一个“叶子”记录,它链接到报告单位。

    我需要制作一个ANSI 92有效的SQL语句(或者最糟糕的一个可以在Oracle,DB2和SQL Server上运行的语句),它将在层次结构的任何地方返回与给定报告单位相关的所有工具。

    e.g。

    • 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个工具?

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分: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”。