You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的结果)和子行(来自原表),实现层级的迭代查询,对应Oracle CONNECT BY的父子关系逻辑。
  • 注意事项:SQL Server默认递归层级上限是100,如果你的数据层级超过这个数,可以在查询末尾加上OPTION (MAXRECURSION 0)来取消限制(但要确保数据没有循环引用,否则会无限递归)。

内容的提问来源于stack exchange,提问作者Giorgos Myrianthous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:36:59