我目前正在将SQL Server SQL语句翻译成他们的ANSI通用等价物,并且使用WITH语句使用递归语句。
为了集中讨论这个问题,我将简化问题如下
如果我有两张桌子
ReportingUnit
设施
此结构描述了直到设施的报告单位的层次结构,其中报告单位可以具有0..1直接父报告单位和0 ... n子报告单位。
设施是一个“叶子”记录,它链接到报告单位。
我需要制作一个ANSI 92有效的SQL语句(或者最糟糕的一个可以在Oracle,DB2和SQL Server上运行的语句),它将在层次结构的任何地方返回与给定报告单位相关的所有工具。
e.g。
ReportingUnit R1.2有子女R1.2.1,R1.2.2
设施F1有一个父报告单位R1.1.1
请记住ReportingUnit表中可能有0 .. n级递归,如果给出参数ReportingUnit = R1,我如何从SQL语句返回所有4个工具?
答案 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”。