【问题标题】:get all child from an parent id从父 ID 中获取所有孩子
【发布时间】:2012-04-11 16:09:53
【问题描述】:

您好,我需要一个查询来执行此操作 我的表格数据

ID        ParentID         DATA
--------------------------------
1             -1             a
2              1             b
3              2             c
4              3             d
5              3             f

以及需要什么以 ID 作为参数并返回所有 recursively childsItself 的查询

parameter : (ID=2)

返回必须是:

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

【问题讨论】:

  • 我猜你忘了提到它必须递归地返回子节点,而不仅仅是父节点的子节点和父节点本身。
  • 可能是这个(它谈到了 linq,但解决方案是一样的;在 sql server 中使用 cte):stackoverflow.com/questions/3299496/…
  • 是的,我也需要所有孩子的孩子:D

标签: sql sql-server-2008


【解决方案1】:

试试这个:

;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

小提琴here.

【讨论】:

    【解决方案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
    

    【讨论】:

    • 如果你需要父母和孩子,那么是的
    • @mX64 我做了一些测试,如果你在锚查询中过滤ID,它看起来有更好的性能。我在ParentID 上使用ID 作为聚集主键和非聚集索引进行了测试。
    • @MikaelEriksson 感谢您指出这一点,我更新了我的答案。我同意在那里过滤可能会更好,除非你想要所有的父/子记录然后在你完成之前不要使用 WHERE 子句。
    【解决方案3】:
    declare @ID int = 2;
    
    with C as
    (
      select ID, ParentID, DATA
      from YourTable
      where ID = @ID
      union all
      select T.ID, T.ParentID, T.DATA
      from YourTable as T
        inner join C 
          on T.ParentID = C.ID
    )
    select ID, ParentID, DATA
    from C
    

    试试SE-Data

    【讨论】:

      【解决方案4】:

      试试这个。

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

      【讨论】:

      • 那行不通,因为他们也想要孩子的孩子。所以他们想要 3 的孩子,因为它是 2 的孩子。
      • 哦,我明白了.. stackoverflow.com/questions/959804/… 可以帮助你。
      猜你喜欢
      • 2018-04-19
      • 2018-10-06
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      相关资源
      最近更新 更多