SQL Server:如何从表创建层次结构组合

问题描述

我将一个层次结构的级别堆叠在一个表中,我想创建组合。我尝试使用递归查询,但无法弄清楚。我相信必须有一种简单的方法来做到这一点。我具有不同级别的层次结构,具有不同的级别数,因此我不想为每个级别编写代码,而想要查询可处理级别数的查询。我将不胜感激!

以下是创建示例数据的代码:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [tmp].[tblSample](
    [hier] [nvarchar](255) NULL,[lvl] [nvarchar](255) NULL,[id] [int] NULL
) ON [PRIMARY]
GO
INSERT [tmp].[tblSample] ([hier],[lvl],[id]) VALUES (N'AA00010102',N'3',3)
GO
INSERT [tmp].[tblSample] ([hier],[id]) VALUES (N'AA00019999',4)
GO
INSERT [tmp].[tblSample] ([hier],[id]) VALUES (N'AA00020107',6)
GO
INSERT [tmp].[tblSample] ([hier],[id]) VALUES (N'AA00029999',7)
GO
INSERT [tmp].[tblSample] ([hier],[id]) VALUES (N'AA11810001',9)
GO
INSERT [tmp].[tblSample] ([hier],[id]) VALUES (N'AA11812087',10)
GO
INSERT [tmp].[tblSample] ([hier],[id]) VALUES (N'AA11852299',12)
GO
INSERT [tmp].[tblSample] ([hier],[id]) VALUES (N'AA1185',N'2',[id]) VALUES (N'AA',N'1',[id]) VALUES (N'AA1181',[id]) VALUES (N'AA0002',[id]) VALUES (N'AA0001',3)
GO

这是我为该特定层次结构生成所需结果的查询:

SELECT t1.hier,t2.hier,t3.hier FROM tblSample t1 
    INNER JOIN tblSample t2 ON t1.id=t2.id AND t2.lvl=t1.lvl+1 
    INNER JOIN tblSample t3 ON t1.id=t3.id  AND t3.lvl=t1.lvl+2

样本数据:

enter image description here

所需结果:

enter image description here

解决方法

这对我来说就像是有条件的聚合:

select max(case when lvl = 1 then hier end),max(case when lvl = 2 then hier end),max(case when lvl = 3 then hier end)
from tblSample
group by id;

或者,您也可以将此短语表述为联接:

select s.hier,s2.hier,s3.hier
from tblSample s join
     tblSample s2
     on s2.lvl = s.lvl + 1 and
        s2.id = s.id join
     tblSample s3
     on s3.lvl = s2.lvl + 1 and
        s3.id = s2.id
where s.lvl = 1;

Here是db 小提琴。

,

我们还可以使用PIVOT,但同样,我们必须在数据透视子句中提供一定的最大值level,并使其动态化,您需要考虑将其转换为{{1} }(不幸的是,我对SQL Server动态SQL不太熟悉)

Dynamic Sql

Demo

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...