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子句。