【问题标题】:Binding a mutltiple parent hierarchy绑定多父层次结构
【发布时间】:2015-04-16 06:41:57
【问题描述】:

我有一张表,其中保存了有关某些分支和层次结构的信息。这些信息不是以可用于维度建模的方式存储的,因此经过多次转换和提取后,我最终得到了:

n0 是第一层,n11 是最高层。 问题是层次结构不能像这样遍历:

SELECT 
    distinct 
        nelem.Element n0,
        primul.Element n1,
        doilea.Element n2, 
        treilea.Element n3,
        patrulea.Element n4 

FROM 
    [MIS].[dbo].[BedrockImportBST] nelem
    left join  [BedrockImportBST] primul on primul.Element=nelem.Value1 and primul.LineType in ('e','p')
    left join  [BedrockImportBST] doilea on doilea.Element=primul.Value1 and doilea.LineType in ('e','p')
    left join  [BedrockImportBST] treilea on treilea.Element=doilea.Value1 and treilea.LineType in ('e','p')
    left join  [BedrockImportBST] patrulea on patrulea.Element=treilea.Value1 and patrulea.LineType in ('e','p')

是否有可能为这个解决方案分配父子关系 id,以便遍历是递归的?

【问题讨论】:

  • 只要层次结构中的级别数是固定的,并且您还拥有每个级别的 ID,而不仅仅是我在屏幕截图中看到的标签,您就可以构建具有单独属性的扁平维度对于每个级别。在正常情况下,平面层次结构将比 SSAS 中的父子层次结构执行得更好。但是你到底想达到什么目的呢?
  • Salut George, voi continua in engleza pentru a intelege si restul daca vor avea nevoie。我没有任何 ID,只有标签,我想生成一个结构为 ID、Parent_Id、Name... 的视图正如您在第一个 pritnscreen 中看到的那样,047 可以有许多层次结构路径(例如:047/ Inland( 100%) / Konzern (100%) / Alle BST-Elemente si 047 / Inland (ant.) / Europa (ant.) / Welt (ant.) / Alle BST-Elemente )
  • @GeorgeTanasie 我在想可能在 cte 或一段时间内遍历......从右到左,Alle BST-Elemente 将是最高级别,047 将是最低级别,但我无法弄清楚我该如何构建它

标签: sql-server parent-child hierarchy recursive-query dimensional


【解决方案1】:

然后只是为了将平面数据转换为父子层次结构,您可以使用下面的简单联合生成唯一 ID(我使用 FlatHierarchy 作为表的名称)。我看到一个特定的元素可以出现在多个级别上,并且可以有不同的父级,这看起来有点奇怪,但在这里:

DECLARE @IDS TABLE
(
    ID INT IDENTITY (1,1) NOT NULL,
    Label varchar(50)
)
INSERT INTO @IDS (Label)
SELECT n0
FROM FlatHierarchy
UNION 
SELECT n1
FROM FlatHierarchy
UNION 
SELECT n2
FROM FlatHierarchy
UNION 
SELECT n3
FROM FlatHierarchy
UNION 
SELECT n4
FROM FlatHierarchy
UNION 
SELECT n5
FROM FlatHierarchy
.....
UNION 
SELECT n11
FROM FlatHierarchy


SELECT i.ID, parent.ID ParentID, i.Label
FROM @IDS i
INNER JOIN FlatHierarchy f ON i.Label = f.n0
LEFT JOIN @IDS parent ON f.n1 = parent.Label
UNION 
SELECT i.ID, parent.ID ParentID, i.Label
FROM @IDS i
INNER JOIN FlatHierarchy f ON i.Label = f.n1
LEFT JOIN @IDS parent ON f.n2 = parent.Label
UNION 
SELECT i.ID, parent.ID ParentID, i.Label
FROM @IDS i
INNER JOIN FlatHierarchy f ON i.Label = f.n2
LEFT JOIN @IDS parent ON f.n3 = parent.Label
UNION 
SELECT i.ID, parent.ID ParentID, i.Label
FROM @IDS i
INNER JOIN FlatHierarchy f ON i.Label = f.n3
LEFT JOIN @IDS parent ON f.n4 = parent.Label
UNION 
SELECT i.ID, parent.ID ParentID, i.Label
FROM @IDS i
INNER JOIN FlatHierarchy f ON i.Label = f.n4
LEFT JOIN @IDS parent ON f.n5 = parent.Label
.....
UNION 
SELECT i.ID, parent.ID ParentID, i.Label
FROM @IDS i
INNER JOIN FlatHierarchy f ON i.Label = f.n10
LEFT JOIN @IDS parent ON f.n11 = parent.Label

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2011-04-05
    相关资源
    最近更新 更多