递归查询-父/子

tnkciper  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(539)

假设我有一张这样的table:

  1. id Parentid childid
  2. --------------------------------
  3. 01 null 02
  4. 02 01 03
  5. 03 02 04
  6. 04 03 06
  7. 05 051 101
  8. 06 04 055

假设我总是被赋予一个中间值,这样一个同时有子节点和父节点的节点,此时我不知道它们是什么。e、 我的身份证号码是4。我已经编写了一个递归查询,它可以同时获取父记录和子记录,但是我不确定它是否是正确的方法,也不确定它是否是最快的方法。

  1. with x as (
  2. --These are the anchor (the parents)
  3. select *
  4. from table with (nolock)
  5. where id= 04
  6. ),
  7. parents as (
  8. SELECT *
  9. FROM x
  10. UNION ALL
  11. SELECT p.*
  12. FROM parents JOIN
  13. table p
  14. ON parents.ID = p.childid
  15. ),
  16. children as (
  17. SELECT top 1 *
  18. FROM x
  19. UNION ALL
  20. SELECT p.*
  21. FROM children JOIN
  22. table p
  23. parents.id = p.parentid
  24. )
  25. SELECT distinct *
  26. FROM parents
  27. UNION
  28. SELECT distinct *
  29. FROM children;

这是如何工作,我希望结果回来,所以将返回id:01,02,03,04,06,因为他们要么是父或子的id 04等。
从本质上说,我想了解的是,递归查询获取给定记录的父项和子项的最佳方法是什么,在哪里查找子项必须使用1列,获取父项必须使用另一列,等等。

nuypyhwy

nuypyhwy1#

这是伪sql术语,但是您只需要2个cte,而且不需要 DISTINCT 得到你想要的东西。横切层次数据,不使用 hierachyid 数据类型永远不会像它可能的那样有效,因为您需要递归。
不管怎样,你只需要:

  1. USE Sandbox;
  2. GO
  3. CREATE TABLE dbo.YourTable (ID int, ParentID int);
  4. INSERT INTO dbo.YourTable (ID,
  5. ParentID)
  6. VALUES(1,NULL),
  7. (2,NULL),
  8. (3,1),
  9. (4,1),
  10. (5,2),
  11. (6,3),
  12. (7,4),
  13. (8,4),
  14. (9,7),
  15. (10,8);
  16. GO
  17. DECLARE @ID int = 4;
  18. WITH Parents AS(
  19. SELECT YT.ID,
  20. YT.ParentID
  21. FROM dbo.YourTable YT
  22. WHERE YT.ID = @ID
  23. UNION ALL
  24. SELECT YT.ID,
  25. YT.ParentID
  26. FROM Parents P
  27. JOIN dbo.YourTable YT ON P.ParentID = YT.ID),
  28. Children AS(
  29. SELECT YT.ID,
  30. YT.ParentID
  31. FROM dbo.YourTable YT
  32. WHERE YT.ID = @ID
  33. UNION ALL
  34. SELECT YT.ID,
  35. YT.ParentID
  36. FROM Children C
  37. JOIN dbo.YourTable YT ON C.ID = YT.ParentID)
  38. SELECT ID, ParentID
  39. FROM Parents P
  40. UNION ALL
  41. SELECT ID, ParentID
  42. FROM Children C
  43. WHERE C.ID != @ID --Stops the initial row being displayed twice
  44. ORDER BY ID ASC;
  45. GO
  46. DROP TABLE dbo.YourTable;
展开查看全部

相关问题