Sql-Server-2012

層次數據:從層次結構中獲取所有節點,包括與 where 不匹配的父節點

  • June 11, 2019

我有一個類似於這種結構的表:

TaskId:  int PK
AssignedTo: varchar(50)
ParentTaskId: int FK nullable

ParentTaskId 引用TaskId。

表中的數據與此類似:

TaskId     |     AssignedTo     |    ParentTaskId

1                Jim                 NULL
2                Jim                 1
3                Joe                 2
4                John                NULL
...

我的問題的癥結在於:我需要在表中查詢分配給 Joe 的所有任務(這將返回 TaskId 3),但我還需要顯示找到的任務的層次結構,因此我需要返回 Tasks 1、2 , 和上表中的 3 個。

我不知道如何通過一個查詢或多個查詢從 SQL 中提取這些數據。

請幫忙!使用 SQL Server 2012。

CREATE TABLE對於以後的文章,最好提供INSERT如下聲明:

create table tasks
(TaskId int not null primary key
,AssignedTo char(5) not null
,ParentTaskId int references tasks (taskid));

insert into tasks (TaskId, AssignedTo, ParentTaskId)
values (1, 'Jim', NULL);
insert into tasks (TaskId, AssignedTo, ParentTaskId)
values (2, 'Jim', 1);
insert into tasks (TaskId, AssignedTo, ParentTaskId)
values (3, 'Joe', 2);
insert into tasks (TaskId, AssignedTo, ParentTaskId)
values (4, 'John', NULL);

也就是說,您可以使用遞歸公用表表達式 (CTE),如下所示:

with tree (ancestortaskid) as (
   select taskid from tasks where assignedto = 'Joe'
   union all
   select ParentTaskId from tree t join tasks s 
       on t.ancestortaskid = s.taskid
)
select t.ancestortaskid 
from tree;

我只有 sql-server2017 可以測試,但是 afaik,遞歸 cte 也應該在 2008 年可用

引用自:https://dba.stackexchange.com/questions/240295