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
我需要将我的 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