作为 Microsoft SQL Server 上的 T-SQL 项目的一部分,我使用递归联合 CTE 通过一些分层数据跟踪一系列子父关系,将每个单独的元素拉入一行,然后将其转换为单个元素排。
例如,我的递归联合 CTE 会将四个 HCC 值的以下行从 A(源表)转换为 B(递归联合表)。C 将是枢轴后期望的结果。
A
成员名字 | 父母名字 |
---|---|
HCC_AS1 | SEC_SMI |
SEC_SMI | BRC_AND |
BRC_AND | OBU_AND |
HCC_AK4 | BRC_BOZ |
BRC_BOZ | OBU_LKY |
HCC_BH1 | OBU_BGH |
肝细胞癌_Z5 | SEC_LNG |
SEC_LNG | BRC_LYN |
BRC_LYN | OBU_LNM |
乙
成员名字 | 父母名字 | 等级制度 | 价值 |
---|---|---|---|
HCC_AS1 | SEC_SMI | 美国证券交易委员会 | 星米 |
HCC_AS1 | SEC_SMI | 商业研究中心 | 和 |
HCC_AS1 | SEC_SMI | 奥布 | 和 |
HCC_AK4 | BRC_BOZ | 商业研究中心 | 博兹 |
HCC_AK4 | BRC_BOZ | 奥布 | 李光耀 |
HCC_BH1 | OBU_BGH | 奥布 | 脑脊液 |
肝细胞癌_Z5 | SEC_LNG | 美国证券交易委员会 | 液化天然气 |
肝细胞癌_Z5 | SEC_LNG | 商业研究中心 | 林恩 |
肝细胞癌_Z5 | SEC_LNG | 奥布 | 线性神经网络 |
C
成员名字 | 父母名字 | 美国证券交易委员会 | 商业研究中心 | 奥布 |
---|---|---|---|---|
HCC_AS1 | SEC_SMI | 星米 | 和 | 和 |
HCC_AK4 | BRC_BOZ | 博兹 | 李光耀 | |
HCC_BH1 | OBU_BGH | 脑脊液 | ||
肝细胞癌_Z5 | SEC_LNG | 液化天然气 | 林恩 | 线性神经网络 |
我唯一遇到的麻烦是保留原始内容MEMBER_NAME
和PARENT_NAME
整个递归 CTE,这是项目的要求。我将它包裹在游标中并插入到临时表中,这样我就有了一些东西供他们查看,但他们想将其更改为视图,所以我不相信我当前的设计会持续下去。我不太精通递归查询。是否有我缺少的解决方案可用于将其变成视图?
DECLARE @member varchar(80)
DECLARE @parent varchar(80)
CREATE TABLE #Temp
(
MEMBER_NAME varchar(80),
PARENT_NAME varchar(80),
Hierarchy varchar(80),
[Value] varchar(80)
);
DECLARE member_cursor CURSOR FOR
SELECT
[MEMBER_NAME], [PARENT_NAME]
FROM
[CACHED_OUTLINE_MEMBERS]
WHERE
DIMENSION_NAME = 'Delivery_Center'
AND LEFT(MEMBER_NAME, 3) = 'HCC'
AND LEFT(PARENT_NAME, 3) IN ('SEC', 'OBU', 'BRC')
OPEN member_cursor
FETCH NEXT FROM member_cursor INTO @member, @parent
WHILE @@FETCH_STATUS = 0
BEGIN
WITH Parent AS
(
SELECT
LEFT(PARENT_NAME, CHARINDEX('_', Parent_name) -1) AS Hierarchy,
RIGHT(Parent_name, LEN(parent_name) - CHARINDEX('_', Parent_name)) AS [Value]
FROM
[CACHED_OUTLINE_MEMBERS]
WHERE
MEMBER_NAME = @member
UNION ALL
SELECT
LEFT(C.PARENT_NAME, CHARINDEX('_', C.Parent_name) -1) AS Hierarchy,
RIGHT(C.Parent_name, LEN(C.parent_name) - CHARINDEX('_', C.Parent_name)) AS [Value]
FROM
[CACHED_OUTLINE_MEMBERS] C
INNER JOIN
Parent ON C.member_name = parent.parent_name
WHERE
LEFT(C.PARENT_NAME, CHARINDEX('_', C.Parent_name) -1) IN ('SEC', 'OBU', 'BRC')
)
INSERT INTO #Temp
SELECT
@member AS MEMBER_NAME, @parent AS PARENT_NAME, Hierarchy, [Value]
FROM
Parent
FETCH NEXT FROM member_cursor INTO @member, @parent
END
CLOSE member_cursor
DEALLOCATE member_cursor
SELECT * FROM #Temp
我尝试了光标,但那时我认为这可能只是一个每天构建一次的表。但他们希望它成为一个视图,所以我必须想出一个不需要光标的设计。
在我开始使用递归 CTE 之前,我尝试只做一个自连接表,但数据的子父关系并不一致。某些 HCC 值没有 SEC 或 BRC 或两者,因此仅执行三个自连接有时会将 OBU 放置在 SEC 或 BRC 列中。