MS-SQL中与Oracle SQL START WITH等价的表达式是什么?
在MS-SQL中替代Oracle START WITH的写法
在SQL Server(也就是你说的MS-SQL)里,和Oracle的START WITH ... CONNECT BY层级查询完全等价的是递归CTE(公共表表达式)。递归CTE通过锚点成员定义层级的根节点,再通过递归成员迭代关联父子节点,完美对应Oracle层级查询的逻辑。
我直接把你给出的Oracle视图创建语句转换成SQL Server的写法,帮你理解对应关系:
Oracle原语句回顾
CREATE VIEW customers AS SELECT LEVEL lvl, customer_code, customer_desc, customer_category FROM customers_master START WITH some_column = '0' CONNECT BY PRIOR CUSTOMER_CODE = PARENT_CUSTOMER_CODE;
对应的SQL Server递归CTE写法
CREATE VIEW customers AS WITH RecursiveCustomers AS ( -- 锚点成员:对应Oracle的START WITH,指定层级的根行 SELECT 1 AS lvl, -- 初始层级为1,和Oracle的LEVEL初始值一致 customer_code, customer_desc, customer_category FROM customers_master WHERE some_column = '0' -- 根行的筛选条件,和START WITH一致 UNION ALL -- 递归成员:对应Oracle的CONNECT BY,定义父行与子行的关联关系 SELECT rc.lvl + 1 AS lvl, -- 层级自增,模拟Oracle的LEVEL cm.customer_code, cm.customer_desc, cm.customer_category FROM customers_master cm INNER JOIN RecursiveCustomers rc ON cm.parent_customer_code = rc.customer_code -- 对应Oracle的PRIOR CUSTOMER_CODE = PARENT_CUSTOMER_CODE ) SELECT * FROM RecursiveCustomers;
关键对应点说明
- 锚点成员:就是递归的起点,完全对应Oracle
START WITH指定的根行。这里我们把初始层级lvl设为1,和Oracle的LEVEL函数初始值匹配。 - 递归成员:通过
UNION ALL连接锚点成员,利用自连接关联父行(来自递归CTE的结果)和子行(来自原表),实现层级的迭代查询,对应OracleCONNECT BY的父子关系逻辑。 - 注意事项:SQL Server默认递归层级上限是100,如果你的数据层级超过这个数,可以在查询末尾加上
OPTION (MAXRECURSION 0)来取消限制(但要确保数据没有循环引用,否则会无限递归)。
内容的提问来源于stack exchange,提问作者Giorgos Myrianthous
相关产品推荐
相关产品推荐

