【发布时间】:2017-10-07 21:51:52
【问题描述】:
我正在尝试将涉及 Oracle SYS_CONNECT_BY_PATH 语法的复杂查询转换为 SQL Server:
SELECT
DISTINCT TO_CHAR(CONCAT(@ROOT, SYS_CONNECT_BY_PATH(CONCAT('C_',X), '.'))) AS X_ALIAS
, TO_CHAR(CONCAT(@ROOT, PRIOR SYS_CONNECT_BY_PATH(CONCAT('C_',X), '.'))) AS X_ALIAS_FATHER
, TO_CHAR(X) AS X_ALIAS_LEAF
, LEVEL AS LVL
FROM MY_TABLE
LEFT JOIN MY_TABLE_BIS MY_TABLE_BIS_ALIAS ON MY_TABLE_BIS_ALIAS.MY_ID = COL_X
LEFT JOIN OTHER_TABLE
ON OTHER_TABLE.MY_ID = COL_X
CONNECT BY (PRIOR ID_SON = ID_FATHER)
AND LEVEL <= MAXDEPTH
START WITH ID_FATHER
IN (SELECT AN_ID AS ID_FATHER FROM BIG_TABLE)
这是我使用this website获得的结果
WITH n(LEVEL, X_ALIAS, X_ALIAS_FATHER, X_ALIAS_LEAF) AS
( SELECT 1, CONCAT('C_',X), CONCAT('C_',X), CAST(X AS VARCHAR(30))
FROM MY_TABLE
LEFT JOIN MY_TABLE_BIS MY_TABLE_BIS_ALIAS
ON MY_TABLE_BIS_ALIAS.MY_ID = COL_X
LEFT JOIN OTHER_TABLE
ON OTHER_TABLE.MY_ID = COL_X
WHERE ID_FATHER IN (SELECT AN_ID AS ID_FATHER
FROM listAllCfaCfq)
UNION ALL
SELECT n.level + 1, n.X_ALIAS + '.' + nplus1.X_ALIAS, n.X_ALIAS_FATHER + '.' + nplus1.X_ALIAS_FATHER, CAST(X AS VARCHAR(30)
FROM MY_TABLE
LEFT JOIN MY_TABLE_BIS MY_TABLE_BIS_ALIAS
ON MY_TABLE_BIS_ALIAS.MY_ID = COL_X
LEFT JOIN OTHER_TABLE
ON OTHER_TABLE.MY_ID = COL_X AS nplus1, n
WHERE n.ID_SON = nplus1.ID_FATHER)
SELECT DISTINCT LEVEL, X_ALIAS, X_ALIAS_FATHER, X_ALIAS_LEAF
WHERE LEVEL <= @MAXDEPTH;
我更改了表格的名称,这样做可能会出错,请不要犹豫,在 cmets 中告诉我
【问题讨论】:
-
listAllCfaCfq未被第一个查询引用。请为表格发布DDL。 -
能否提供表格数据
-
如果您在 SQL Server 中使用 hierachyid(我无法确定,因为您还没有发布表结构),那么您可以使用 CAST(hierarchyid as nvarchar(100)) 来显示这样的路径: /2/1/2/1/ 每行
-
不知道为什么这么多人赞成这个。它应该在提供 DDL 之前关闭。
-
您已经回答了自己的问题,为什么不将其作为答案。有人纠正你的错误的机会很小。
标签: sql-server tsql hierarchical-data recursive-query