-1

鉴于此表...

CREATE TABLE [dbo].[Data](
    [Id] [int] NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [ParentId] [int] NULL,
 CONSTRAINT [PK_Data] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

和相关数据...

BEGIN TRANSACTION;
INSERT INTO [dbo].[Data]([Id], [Name], [ParentId])
SELECT 1, N'George', 4 UNION ALL
SELECT 2, N'Amit', 1 UNION ALL
SELECT 3, N'Chad', 1 UNION ALL
SELECT 4, N'David', NULL UNION ALL
SELECT 5, N'Tess', 3 UNION ALL
SELECT 6, N'Emma', 3
COMMIT;
RAISERROR (N'[dbo].[Data]: Insert Batch: 1.....Done!', 10, 1) WITH NOWAIT;
GO

您能否为我提供 2 个单独的 CTE SQL 来返回给定 ID 的后代和祖先?

4

2 回答 2

1

这样的事情应该让你朝着正确的方向前进:

with childcte as (
  select id, name, parentid
  from data
  where id = 2
  union all
  select d.id, d.name, d.parentid
  from data d
    join childcte on d.parentid = childcte.id 
), parentcte as (
  select id, name, parentid
  from data
  where id = 2
  union all
  select d.id, d.name, d.parentid
  from data d
    join parentcte on d.id  = parentcte.parentid 
  )
select *
from childcte
union 
select *
from parentcte;
于 2013-06-12T20:57:53.263 回答
1

试试这个 CTE。您还需要与您的用户表联合。我正在获取与您正在搜索的用户相关的所有层次结构,并将获取所有子级。

查询将从根开始,这就是查询的第一部分具有 where ParentId = null的原因。第二个是获取所有根的孩子,依此类推第四个。

声明@UserId int
 选择@UserId = 1

WITH 层次结构(Id,ParentId)AS
(
      选择
            标识,父标​​识
      从
            [dbo].[数据]
      在哪里
            父母身份为空
      联合所有
      选择
            u1.Id, u1.ParentId
      从
             [dbo].[数据] u1  
      INNER JOIN 层次结构开启
            u1.ParentId = 层次结构.Id
)

选择 * 从层次结构中 ParentId = @UserId;
于 2013-06-12T20:59:06.470 回答