SYS_CONNECT_BY_PATH 相当于 t-SQL

SYS_CONNECT_BY_PATH equivalent in t-SQL

我需要将我的 Oracle 查询转换成 SQL 服务器。

查询生成基于用户名的“管理层次结构”。输出将有一个管理链,最后一个元素是当前经理。

Table:

EE_USERNAME     MGR_USERNAME  
user1       ceo
user2       user1
user3       user2
user4       user1
user5       user2
user6       user3

示例输出:

user1: ceo
user2: ceo,user1
user3: ceo,user1,user2
user4: ceo,user1
user5: ceo,user1,user2
user6: ceo,user1,user2,user3

我的 Oracle 查询:

SELECT EMPLOYEE_DATA.* ,  SYS_CONNECT_BY_PATH(MGR_USERNAME, ',') "Path"
FROM EMPLOYEE_DATA
START WITH MGR_USERNAME = 'ceo'
CONNECT BY NOCYCLE  prior  EE_USERNAME = MGR_USERNAME   

此查询的 SQL 服务器等效项是什么?

;WITH cte AS (
    SELECT e.*, mgr.EE_USERNAME AS Path
        FROM EMPLOYEE_DATA AS mgr
        JOIN EMPLOYEE_DATA AS e ON mgr.EE_USERNAME = e.MGR_USERNAME
        WHERE mgr.EE_USERNAME = 'ceo'
    UNION ALL
    SELECT e.*, mgr.Path + ',' + mgr.EE_USERNAME AS Path
        FROM cte AS mgr
        JOIN EMPLOYEE_DATA e ON mgr.EE_USERNAME = e.MGR_USERNAME
)
SELECT *
FROM cte
-- OPTION (MAXRECURSION 200)  -- if you need a different value
;

如果你经常做递归,你应该看看 MAXRECURSION,它的默认值为 100。

Charlieface 的查询省略了 Oracle 的 NOCYCLE 指令提供的功能,该指令表示如果同一条记录第二次返回则停止递归。

如果你想要这种保护,你可以在 CTE 查询的递归部分添加一个 Where 子句:

Where Instr(mgr.EE_Username,mgr.Path)=0