递归查询-父/子

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

假设我有一张这样的table:

id      Parentid    childid

    --------------------------------
      01         null       02
      02         01         03
      03         02         04
      04         03         06
      05         051        101
      06         04         055

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

with x as (
  --These are the anchor (the parents)
  select *
  from table with (nolock)
  where id= 04
  ),
  parents as (
  SELECT * 
    FROM x
    UNION ALL
    SELECT p.* 
    FROM parents JOIN
         table p
         ON parents.ID = p.childid

  ),
  children as (
  SELECT top 1 * 
    FROM x
    UNION ALL
    SELECT p.* 
    FROM children JOIN
         table p
         parents.id = p.parentid

  )

SELECT distinct * 
FROM parents
UNION
SELECT distinct *
FROM children;

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

nuypyhwy

nuypyhwy1#

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

USE Sandbox;
GO

CREATE TABLE dbo.YourTable (ID int, ParentID int);

INSERT INTO dbo.YourTable (ID,
                           ParentID)
VALUES(1,NULL),
      (2,NULL),
      (3,1),
      (4,1),
      (5,2),
      (6,3),
      (7,4),
      (8,4),
      (9,7),
      (10,8);
GO
DECLARE @ID int = 4;

WITH Parents AS(
    SELECT YT.ID,
           YT.ParentID
    FROM dbo.YourTable YT
    WHERE YT.ID = @ID
    UNION ALL
    SELECT YT.ID,
           YT.ParentID
    FROM Parents P
         JOIN dbo.YourTable YT ON P.ParentID = YT.ID),
Children AS(
    SELECT YT.ID,
           YT.ParentID
    FROM dbo.YourTable YT
    WHERE YT.ID = @ID
    UNION ALL
    SELECT YT.ID,
           YT.ParentID
    FROM Children C
         JOIN dbo.YourTable YT ON C.ID = YT.ParentID)
SELECT ID, ParentID
FROM Parents P
UNION ALL
SELECT ID, ParentID
FROM Children C
WHERE C.ID != @ID --Stops the initial row being displayed twice
ORDER BY ID ASC; 

GO

DROP TABLE dbo.YourTable;

相关问题