我正在开发一个SSIS项目来构建数据仓库。
这是我为加载维度表(Locations)而构建的简单SSIS流程。 位置表包含基于嵌套集(LEFT,RIGHT,LEVEL字段)的父/子结构。 因此,插入过程和更新过程一样。
但是,我需要填充计算列(PARENT_ID)以存储父关系。 因此,对于每一行,我需要在SQL语句中使用(LEFT,RIGHT和LEVEL列)来查找PARENT_ID值。
这是源表的表结构:
那么在加载过程中填充parent_id列的最佳方法是什么? 我应该为此流程构建专用数据流吗?
我可以在Derived列组件中使用SQL语句来查找parent_id值吗?
编辑:这是我的SQL查询,用于更新我的父/子结构(parent_id字段)。
UPDATE
L1
SET L1.[PARENT_ID] = (
SELECT TOP 1 L2.ID
FROM [DW].[DimLocation] L2
WHERE L2.[TREE_LEFT_VALUE] < L1.[TREE_LEFT_VALUE] AND L2.[TREE_RIGHT_VALUE] > L1.[TREE_RIGHT_VALUE]
ORDER BY L2.[TREE_RIGHT_VALUE]-L1.[TREE_RIGHT_VALUE] ASC)
FROM [DW].[DimLocation] L1
WHERE [TREE_LEFT_VALUE] > 1
编辑2 :这是一个表示嵌套集结构以及如何在数据库中表示它的图表。
因此,每个节点都包含TREE_LEFT_VALUE
和TREE_RIGHT_VALUE
个值,这些值分别绑定了其子级TREE_LEFT_VALUE
/ TREE_RIGHT_VALUE
值。
它在一个简单的查询中查找指定节点的所有子节点。例如,如果我想要&#34; ROOT 1&#34;的所有孩子。节点,我需要查询TREE_LEFT_VALUE
大于2且TREE_RIGHT_VALUE
小于5的所有节点。
因为我需要在我的数据仓库中使用parent_id结构(SSAS项目来构建OLAP多维数据集),所以我需要通过添加父节点ID来更新PARENT_ID字段。因此,我需要使用TREE_LEFT_VALUE
和TREE_RIGHT_VALUE
字段查询父节点ID,然后在更新语句中使用结果。
它工作正常,但是有更有效的方法吗?
谢谢,
答案 0 :(得分:2)
如果列可以为空,我会在数据流后用SQL任务更新它。这将确保在您尝试查找parentid之前插入所有可能的父行 - 此外,它将保持基于进程集,而不是尝试在数据流任务中进行查找。