簡體   English   中英

過濾掉分層數據

[英]Filtering out hierarchical data

我需要幫助解決我在處理分層數據時遇到的問題。

維護分層數據的表的架構:

分類表:

|   ID  |   Label | 

映射表:

|   ID  |   QualifierID     | ItemID    | ParentID  |

第 1 步:編寫一個簡單的自連接查詢來轉換上面的映射:

WITH category_masterlist AS (
  SELECT    id,
            label
  FROM Category
)

select id, id as itemid, label, NULL as parentId from [Category] where categoryLevel = 1
UNION
select itemid as id, itemId, (select label from category_masterlist where id = cm.itemid) Label, parentId
from [CategoryMapping] cm

第二步:使用公用表表達式寫了一個自連接查詢返回映射數據如下:

WITH CategoryCTE(ParentID, ID, Label, CategoryLevel) AS
(
    SELECT ParentID, ItemID, Label, 0 AS CategoryLevel
    FROM [view_TreeviewCategoryMapping]
    WHERE ParentID IS NULL
    UNION ALL
    SELECT e.ParentID, e.ItemID, e.Label, CategoryLevel + 1
    FROM [view_TreeviewCategoryMapping] AS e
        INNER JOIN CategoryCTE AS d
        ON e.ParentID = d.ID
)
SELECT distinct ParentID, ID, Label, CategoryLevel
FROM CategoryCTE

|   ID  |   Label           | ParentID  | CategoryLevel |
--------------------------------------------------------------------------------                                
|   90  |   Satellite       |   NULL    |   0       |
|   91  |   Concrete        |   NULL    |   0       |
|   92  |   ETC             |   NULL    |   0       |
|   93  |   Chisel          |   NULL    |   0       |
|   94  |   Steel           |   NULL    |   0       |
|   96  |   Wood            |   NULL    |   0       |
|   97  |   MIC Systems     |   90      |   1       |
|   97  |   MIC Systems     |   91      |   1       |
|   99  |   Foundations     |   91      |   1       |
|   100 |   Down Systems    |   91      |   1       |
|   101 |   Side Systems    |   91      |   1       |
|   102 |   Systems         |   91      |   1       |
|   98  |   DWG             |   92      |   1       |   
|   97  |   MIC Systems     |   93      |   1       |
|   97  |   MIC Systems     |   94      |   1       |
|   99  |   Foundations     |   94      |   1       |   
|   100 |   Down Systems    |   94      |   1       |
|   101 |   Side Systems    |   94      |   1       |
|   102 |   Systems         |   94      |   1       |
|   97  |   MIC Systems     |   95      |   1       |
|   98  |   DWG             |   95      |   1       |
|   102 |   Systems         |   95      |   1       |
|   103 |   Project Management| 95      |   1       |   
|   104 |   Software        |   95      |   1       |
|   99  |   Foundations     |   96      |   1       |
|   119 |   Fronts          |   97      |   2       |
|   121 |   Technology      |   98      |   2       |
|   112 |   Root Systems    |   98      |   2       |   
|   112 |   Root Systems    |   99      |   2       |
|   137 |   Closed Systems  |   112     |   3       |
|   203 |   Support         |   121     |   3       |

第 3 步:我想過濾以上結果,以便只返回完全映射的類別。 完成的映射是具有級別=3 的子級的映射。 例如,下面是我根據上述結果集尋找的內容:

|   ID  |   Label           | ParentID  | CategoryLevel |
--------------------------------------------------------------------------------

|   96  |   Wood            |   NULL    |   0       |
|   92  |   ETC             |   NULL    |   0       |
|   98  |   DWG             |   92      |   1       |
|   99  |   Foundations     |   96      |   1       |
|   121 |   Technology      |   98      |   2       |
|   112 |   Root Systems    |   98      |   2       |
|   112 |   Root Systems    |   99      |   2       |
|   137 |   Closed Systems  |   112     |   3       |
|   203 |   Support         |   121     |   3       |

第 4 步:最終,應向最終用戶顯示如下樹視圖控件:

Root
|
|---Wood
|   |---Foundations
|       |---Root Systems
|           |---Closed Systems
|
|---ETC
|   |---DWG
|       |---Technology
|           |---Support
|       |---Root Systems
|           |---Closed Systems

請注意,一個類別可以有多個父級。 例如,Root Systems 有兩個父項 - DWG 和 Foundations。 我是否得到了類別和映射表的正確架構,尤其是在一個類別可以有多個父項的情況下?

如何從第 2 步到第 3 步過濾掉未完全映射的類別? 這是我無法跨越的障礙。 任何指針? 我可以在應用程序級別過濾掉它們,但我真的很想在數據庫級別過濾掉它們。

我樂於接受有助於我實現目標的建議。 我還想確認我正在使用的模式是最有效的模式。

謝謝!

這是一個使用數據類型hierarchyID的工作選項

嵌套是可選的,實際上是為了說明。

例子

Declare @Top   int         = null      --<<  Sets top of Hier Try 94
 
;with cteP as (
      Select ID
            ,ParentID 
            ,Label 
            ,HierID = convert(hierarchyid,concat('/',ID,'/'))
      From   YourTable 
      Where  IsNull(@Top,-1) = case when @Top is null then isnull(ParentID ,-1) else ID end
      Union  All
      Select ID  = r.ID
            ,Pt  = r.ParentID 
            ,Label   = r.Label
            ,HierID = convert(hierarchyid,concat(p.HierID.ToString(),r.ID,'/'))
      From   YourTable r
      Join   cteP p on r.ParentID  = p.ID)
Select Lvl   = HierID.GetLevel()
      ,ID
      ,ParentID
      ,Label  = replicate('|----',HierID.GetLevel()-1) + Label  -- Nesting Optional ... For Presentation
      ,HierID_String = HierID.ToString()
 From cteP A
 Order By A.HierID

結果

在此處輸入圖像描述

現在如果@Top 設置為 94

在此處輸入圖像描述

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM