2008-11-24 52 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