Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从父id获取所有子项_Sql_Sql Server 2008 - Fatal编程技术网

Sql 从父id获取所有子项

Sql 从父id获取所有子项,sql,sql-server-2008,Sql,Sql Server 2008,嗨,我需要一个查询来做这个 我的表格数据 ID ParentID DATA -------------------------------- 1 -1 a 2 1 b 3 2 c 4 3 d 5 3 f 我需要一个以ID

嗨,我需要一个查询来做这个 我的表格数据

ID        ParentID         DATA
--------------------------------
1             -1             a
2              1             b
3              2             c
4              3             d
5              3             f
我需要一个以ID为参数并递归返回所有
child
本身的查询

parameter : (ID=2)
报税表必须是:

ID        ParentID         DATA
--------------------------------
2              1             b
3              2             c
4              3             d
5              3             f
试试这个

select * from table where id= 2 or parentid = 2
试试这个

select * from table where id= 2 or parentid = 2

这应该可以为您做到:

create table #temp 
(
    id int, 
    parentid int,
    data varchar(1)
)
insert #temp (id, parentid, data) values (1, -1, 'a')
insert #temp (id, parentid, data) values (2,1, 'b')
insert #temp (id, parentid, data) values  (3,2, 'c')
insert #temp (id, parentid, data) values  (4,3, 'd')
insert #temp (id, parentid, data) values  (5,3, 'f')

; with cte as (
    select  id, parentid, data, id as topparent
    from    #temp
    union all
    select  child.id, child.parentid, child.data, parent.topparent
    from    #temp child
    join    cte parent
    on      parent.id = child.parentid

)
select  id, parentid, data
from    cte
where topparent = 2

drop table #temp
编辑或您可以将
WHERE
子句放入第一个
select

create table #temp 
(
    id int, 
    parentid int,
    data varchar(1)
)
insert #temp (id, parentid, data) values (1, -1, 'a')
insert #temp (id, parentid, data) values (2,1, 'b')
insert #temp (id, parentid, data) values  (3,2, 'c')
insert #temp (id, parentid, data) values  (4,3, 'd')
insert #temp (id, parentid, data) values  (5,3, 'f')

; with cte as (
    select  id, parentid, data, id as topparent
    from    #temp
    WHERE id = 2
    union all
    select  child.id, child.parentid, child.data, parent.topparent
    from    #temp child
    join    cte parent
    on      parent.id = child.parentid

)
select  id, parentid, data
from    cte

drop table #temp
结果:

id  parentid      data
2   1              b
3   2              c
4   3              d
5   3              f

这应该可以为您做到:

create table #temp 
(
    id int, 
    parentid int,
    data varchar(1)
)
insert #temp (id, parentid, data) values (1, -1, 'a')
insert #temp (id, parentid, data) values (2,1, 'b')
insert #temp (id, parentid, data) values  (3,2, 'c')
insert #temp (id, parentid, data) values  (4,3, 'd')
insert #temp (id, parentid, data) values  (5,3, 'f')

; with cte as (
    select  id, parentid, data, id as topparent
    from    #temp
    union all
    select  child.id, child.parentid, child.data, parent.topparent
    from    #temp child
    join    cte parent
    on      parent.id = child.parentid

)
select  id, parentid, data
from    cte
where topparent = 2

drop table #temp
编辑或您可以将
WHERE
子句放入第一个
select

create table #temp 
(
    id int, 
    parentid int,
    data varchar(1)
)
insert #temp (id, parentid, data) values (1, -1, 'a')
insert #temp (id, parentid, data) values (2,1, 'b')
insert #temp (id, parentid, data) values  (3,2, 'c')
insert #temp (id, parentid, data) values  (4,3, 'd')
insert #temp (id, parentid, data) values  (5,3, 'f')

; with cte as (
    select  id, parentid, data, id as topparent
    from    #temp
    WHERE id = 2
    union all
    select  child.id, child.parentid, child.data, parent.topparent
    from    #temp child
    join    cte parent
    on      parent.id = child.parentid

)
select  id, parentid, data
from    cte

drop table #temp
结果:

id  parentid      data
2   1              b
3   2              c
4   3              d
5   3              f
试穿

试试这个:

;with temp as (
  select id, parentId, data from t
  where id = 2
  union all
  select t.id, t.parentId, t.data from t
  join temp on temp.id = t.parentId
)
select * from temp
小提琴。

试试这个:

;with temp as (
  select id, parentId, data from t
  where id = 2
  union all
  select t.id, t.parentId, t.data from t
  join temp on temp.id = t.parentId
)
select * from temp

Fiddle.

我猜您忘了提到它必须递归返回子级,而不仅仅是父级的子级,以及父级本身。这可能是重复的(这涉及linq,但解决方案是相同的;在sql server中使用cte):是的,我也需要所有子对象的子对象:我猜你忘了提到它必须递归返回子对象,不仅仅是父对象的子对象,还有父对象本身。这可能是重复的(这涉及linq,但解决方案是相同的;在sql server中使用cte):是的,我也需要所有孩子的孩子:那不行,因为他们也想要孩子的孩子。所以他们想要3个孩子,因为这是2个孩子。。也许能帮你,但这行不通,因为他们也想要孩子的孩子。所以他们想要3个孩子,因为这是2个孩子。。如果你需要父母和孩子,那么yes@mX64我做了一些测试,如果在锚查询中过滤
ID
,它的性能看起来会更好。我用
ID
作为聚集主键和
ParentID
@MikaelEriksson上的非聚集索引进行了测试。感谢您指出这一点,我用这两种方法更新了我的答案。我同意最好在那里进行筛选,除非您需要所有的父/子记录,然后在完成之前不要使用WHERE子句。如果您需要父/子记录,那么yes@mX64我做了一些测试,如果在锚查询中过滤
ID
,它的性能看起来会更好。我用
ID
作为聚集主键和
ParentID
@MikaelEriksson上的非聚集索引进行了测试。感谢您指出这一点,我用这两种方法更新了我的答案。我同意最好在那里进行过滤,除非您想要所有的父/子记录,然后在完成之前不要使用WHERE子句。