我有一张表 beta ,其中包含cols Id,Parent,Name,Level
CREATE TABLE [beta](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Parent] [int] NULL,
[Name] [varchar](150) NOT NULL,
[Level] [int] NULL,
CONSTRAINT [PK_Beta] 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]
GO
示例内容
Id Parent Name Level
1 NULL Clinical 1
2 NULL Custom 1
3 NULL Medicare 1
4 NULL Validation 1
5 1 Medicaid 2
6 2 CD 2
7 3 Specialty 2
8 5 Fraud 3
9 2 Institutional 3
10 8 Professional 4
我很独特。最多有4个级别。每个姓名'可以追溯到1级.1级'父母'永远是NULL。
我正在尝试检索结果sot看起来像这样
Level1 Level2 Level3 Level4 Id
Clinical Medicaid Fraud Professional 1, 5, 8, 10
Custom CD NULL NULL 2, 6
...............
或者像这样
Level1 Level2 Level3 Level4 Level1Id Leve2Id Level3Id Level4Id
Clinical Medicaid Fraud Professional 1 5 8 10
Custom CD NULL NULL 2 6 NULL NULL
...............
我如何在SQL查询中获得此信息
答案 0 :(得分:1)
如果您有固定数量的级别
示例强>
Declare @YourTable Table ([Id] int,[Parent] int,[Name] varchar(50),[Level] int)
Insert Into @YourTable Values
(1,NULL,'Clinical',1)
,(2,NULL,'Custom',1)
,(3,NULL,'Medicare',1)
,(4,NULL,'Validation',1)
,(5,1,'Medicaid',2)
,(6,2,'CD',2)
,(7,3,'Specialty',2)
,(8,5,'Fraud',3)
,(9,2,'Institutional',3)
,(10,8,'Professional',4)
;with cteP as (
Select Id
,Parent
,PathID = cast(Id as varchar(500))
,PathNm = cast(name as varchar(500))
From @YourTable
Where Parent is null
Union All
Select Id = r.Id
,Parent = r.Parent
,PathID = cast(p.PathID+', '+cast(r.Id as varchar(25)) as varchar(500))
,PathNm = cast(p.PathNm+'||'+r.name as varchar(500))
From @YourTable r
Join cteP p on r.Parent = p.Id)
Select B.*
,ID = A.PathID
From cteP A
Cross Apply (
Select Level1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Level2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Level3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
,Level4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
From (Select Cast('<x>' + replace((Select replace(PathNm,'||','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as X
) B
Order by A.PathID
<强>返回强>