所以我有两个表格结构如下:
CREATE TABLE #nodes(node int NOT NULL);
ALTER TABLE #nodes ADD CONSTRAINT PK_nodes PRIMARY KEY CLUSTERED (node);
CREATE TABLE #arcs(child_node int NOT NULL, parent_node int NOT NULL);
ALTER TABLE #arcs ADD CONSTRAINT PK_arcs PRIMARY KEY CLUSTERED (child_node, parent_node);
INSERT INTO #nodes(node)
VALUES (1), (2), (3), (4), (5), (6), (7);
INSERT INTO #arcs(child_node, parent_node)
VALUES (2, 3), (3, 4), (2, 6), (6, 7);
Run Code Online (Sandbox Code Playgroud)
如果我有两个节点,请说1和2.我想要一个根节点列表.在这种情况下,它将是1,4和7.我如何编写查询来获取该信息?
我写了一篇文章,但遇到了一个问题,我不能在CTE的递归部分使用LEFT连接,原因不明.如果我被允许执行LEFT JOIN,那么这个查询将起作用.
WITH root_nodes
AS (
-- Grab all the leaf nodes I care about and their …Run Code Online (Sandbox Code Playgroud) 我在尝试以递归方式遍历层次结构以查找可能具有多个顶级节点的组织结构中的所有后代节点的顶级节点时遇到问题.我试图使用SQL Server 2012 CTE这样做,但它不会递归到达每个分支的最顶级节点.我已经尝试过完全按照与此相关的其他帖子中显示我的查询,但仍然没有骰子.(至少我想我是.)我希望有人可以告诉我这里我做错了什么?这篇文章与我正在尝试做的事情密切相关,我已经按照接受的答案,但我仍然只是"得到它":在SQL中找到顶级父级

如上所示,我有OrgGroups引用直接父组,除非它是顶级然后它是NULL.例如,(4)财务(顶级) - >(5)人力资源 - >(11)福利
我想创建一个数据库视图,列出每个OrgGroup以及他们的TOP-MOST祖先的ID.(不是他们的直接父母)
因此,例如,DB View将拥有(11)Benefits OrgGroup的记录,以及(4)Finance的最顶层parentgroupId的相应列值.
;WITH OrgStructureIndex AS
(
SELECT O.OrgGroupId, O.Name, O.OrgStructureId, O.ParentGroupId, 1 AS Lvl
FROM OrgGroups O
UNION ALL
SELECT OG.OrgGroupId, OG.Name, OG.OrgStructureId, OG.ParentGroupId, Lvl+1 AS Lvl
FROM OrgGroups OG INNER JOIN OrgStructureIndex OI
ON OI.OrgGroupId = OG.ParentGroupId
)
SELECT * FROM OrgStructureIndex
Run Code Online (Sandbox Code Playgroud)
这导致福利组织组具有最高的ParentGroupId(5)HR.期望的结果将是(4)财务.它还会导致重复记录.

至少要删除重复项,我已将SQL更改为:
;WITH OrgStructureIndex AS
(
SELECT O.OrgGroupId, O.Name, O.OrgStructureId, O.ParentGroupId, 1 AS Lvl
FROM OrgGroups O
UNION ALL …Run Code Online (Sandbox Code Playgroud) sql-server recursive-query common-table-expression hierarchical-data