Sql 如何获取ID';自参考表的定义?

Sql 如何获取ID';自参考表的定义?,sql,tsql,Sql,Tsql,我有一个表,其设置类似于: MyTable Id INT Name VARCHAR ParentId INT 现在让我们假设此表中的数据如下所示: 1 AAA NULL 2 BBB 1 3 CCC 2 4 DDD 1 5 EEE 4 6 FFF NULL 我如何编写一个函数,它将接受一个id(int)并将所有可能的子项的id表返回给该父项 例如,我调用SomeFunction(1)并期望得到: 1 2 3 4 5 能够编写一个函数,但只有在

我有一个表,其设置类似于:

MyTable
Id        INT
Name      VARCHAR
ParentId  INT
现在让我们假设此表中的数据如下所示:

1  AAA  NULL
2  BBB  1
3  CCC  2
4  DDD  1
5  EEE  4
6  FFF  NULL
我如何编写一个函数,它将接受一个id(int)并将所有可能的子项的id表返回给该父项

例如,我调用SomeFunction(1)并期望得到:

1
2
3
4
5

能够编写一个函数,但只有在子函数与父函数不同的情况下才能工作,但是我需要能够支持该场景。

这可以通过递归cte来完成

with children as 
(select id as child, parentid as parent
 from mytable
 where parentid is null
 union all
 select m.id, coalesce(c.parent,m.parentid) 
 from mytable m
 join children c on m.parentid=c.child
)
select child
from children
where parent = 1

这可以通过递归cte来完成

with children as 
(select id as child, parentid as parent
 from mytable
 where parentid is null
 union all
 select m.id, coalesce(c.parent,m.parentid) 
 from mytable m
 join children c on m.parentid=c.child
)
select child
from children
where parent = 1

递归CTE是一种方法。对于特定id的所有子项,更简单的版本是:

with children as (
      select id 
      from mytable
      where id = 1
      union all
      select m.id 
      from mytable m join
           children c
           on m.parentid = c.id
     )
select *
from children

递归CTE是一种可行的方法。对于特定id的所有子项,更简单的版本是:

with children as (
      select id 
      from mytable
      where id = 1
      union all
      select m.id 
      from mytable m join
           children c
           on m.parentid = c.id
     )
select *
from children

提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,
tsql
缩小了选择范围,但没有指定数据库。提示:使用适当的软件(MySQL、Oracle、DB2等)和版本(例如,
sql-server-2014
)标记数据库问题很有帮助。语法和特征的差异通常会影响答案。请注意,
tsql
缩小了选择范围,但没有指定数据库。