我用Oracle编写了以下查询
delete from EQUI_HIERARCHY;
select max(level) into v_max_depth
from EQUIP_D
connect by prior EQUIP_NO=PARENT_EQUIP_NO
start with PARENT_EQUIP_NO is null;
如何将其转换为SQL Server?
答案 0 :(得分:1)
实现递归查询的SQL
标准方法,如IBM DB2和SQL Server是WITH子句。有关将CONNECT BY转换为WITH(技术上是递归CTE)的一个示例,请参阅this article - 该示例适用于DB2,但我相信它也适用于SQL Server。
在SQL Server
,IBM DB2或PostgreSQL 8.4(以及SQL标准中,为了它的价值;-),完全等效的解决方案是一个递归查询(更复杂的语法,但实际上,甚至更多的力量和灵活性):
WITH n(v_max_depth ) AS
(SELECT max(level)
FROM EQUIP_D
WHERE PARENT_EQUIP_NO IS NULL
UNION ALL
SELECT max(level)
FROM EQUIP_D as nplus1, n
WHERE n.EQUIP_NO= nplus1.PARENT_EQUIP_NO)
SELECT max(v_max_depth) FROM n
Oracle的START WITH
子句成为第一个嵌套SELECT
,递归的基本情况,是UNIONed
,递归部分只是另一个SELECT
。
SQL的特定版本的WITH当然记录在MSDN上,它也为使用此关键字提供了指导和限制,以及几个示例。