2015-10-05 83 views
0

以獨特的值組合順序獲取數據作爲我的項目的一部分,我需要設計目錄樹,它需要以特定格式從Sql數據庫表中獲取數據。下面是包含虛擬數據和預期結果的表。這將幫助你們找到解決方案。SQL Server從表

catalog_tree_mstr

id | catalog_code | | attribute_id | level 
1  1     1     1 
2  1     2     2 
3  1     3     6 
4  2     3     1 
5  2     1     2 

此表「catalog_tree_mstr」包含與目錄相關聯的屬性和屬性級別(屬性順序在其導致將顯示)。

列'attribute_id'是表'屬性'的引用鍵。

屬性

id | attribute_systemname 
1   attribute_01 
2   attribute_02 
3   attribute_03 

屬性的這種 '屬性' 具有名稱表。

dynamic_article_mstr

id | article_id | attribute_01 | attribute_02 | attribute_03 
1   1   performance  football  accessories 
2   2   performance  football  apparel 
3   3   performance  football  apparel 
4   4   Performance  basketball  footwear 
5   5   Performance  basketball  accessories 
7   6   Originals  Football  Apparel 
9   8   Originals  basketball  Apparel 
10   9   Originals  basketball  accessories 
11   10   Originals  basketball  Apparel 

具有屬性名稱列該 'dynamic_article_mstr' 表。

我想顯示每個獨特的屬性值組合,如逗號分隔,如下所示。

輸入參數是表'dynamic_article_mstr'的'catalog_code'。

下面需要catalog_code結果= 1

1  performance,football,accessories 
    2  performance,football,apparel 
    3  Performance,basketball,footwear 
    4  Performance,basketball,accessories 
    5  Originals,Football,Apparel 
    6  Originals,basketball,Apparel 
    7  Originals,basketball,accessories 

下面需要catalog_code = 2

1 accessories,performance 
    2 accessories,Originals 
    3 apparel,performance 
    4 apparel,Originals 
    5 footwear,Performance 

回答

0

我敢肯定,這不是最優的,但這個查詢結果應該符合您的期望:

DECLARE @CatalogCode INT = 2; 

DECLARE @tmp TABLE (id INT, article_id INT, att1 NVARCHAR(30), att2 NVARCHAR(30), att3 NVARCHAR(30)) 

INSERT INTO @tmp (id, article_id, att1, att2, att3) 
SELECT x.id , 
     x.article_id , 
     x.attribute_01 , 
     x.attribute_02 , 
     x.attribute_03 
FROM (SELECT dam.id , 
        dam.article_id , 
        CASE WHEN EXISTS (SELECT 1 
             FROM  dbo.catalog_tree_mstr ctm 
             WHERE ctm.catalog_code = @CatalogCode 
               AND ctm.attribute_id = 1) 
         THEN dam.attribute_01 
         ELSE NULL 
        END AS attribute_01 , 
        CASE WHEN EXISTS (SELECT 1 
             FROM  dbo.catalog_tree_mstr ctm 
             WHERE ctm.catalog_code = @CatalogCode 
               AND ctm.attribute_id = 2) 
         THEN dam.attribute_02 
         ELSE NULL 
        END AS attribute_02 , 
        CASE WHEN EXISTS (SELECT 1 
             FROM  dbo.catalog_tree_mstr ctm 
             WHERE ctm.catalog_code = @CatalogCode 
               AND ctm.attribute_id = 3) 
         THEN dam.attribute_03 
         ELSE NULL 
        END AS attribute_03 
      FROM  dbo.dynamic_article_mstr dam 
     ) x; 

SELECT DISTINCT (SELECT x.att1 + ',' AS [text()] 
FROM 
(
    SELECT t.id , 
      t.article_id , 
      t.att1 , 
      (SELECT ctm.level FROM dbo.catalog_tree_mstr ctm WHERE ctm.catalog_code = @CatalogCode AND ctm.attribute_id = 1) AS lvl 
    FROM @tmp t 
    WHERE t.att1 IS NOT NULL 
    UNION ALL 
    SELECT t.id , 
      t.article_id , 
      t.att2 , 
      (SELECT ctm.level FROM dbo.catalog_tree_mstr ctm WHERE ctm.catalog_code = @CatalogCode AND ctm.attribute_id = 2) 
    FROM @tmp t 
    WHERE t.att2 IS NOT NULL 
    UNION ALL 
    SELECT t.id , 
      t.article_id , 
      t.att3 , 
      (SELECT ctm.level FROM dbo.catalog_tree_mstr ctm WHERE ctm.catalog_code = @CatalogCode AND ctm.attribute_id = 3) 
    FROM @tmp t 
    WHERE t.att3 IS NOT NULL) x 
    WHERE dam.article_id = x.article_id 
    ORDER BY x.lvl ASC 
    FOR XML PATH('') 
    ) AS att 
FROM dbo.dynamic_article_mstr dam 
+0

親愛的拉法爾感謝您的解答。我需要一些更多的幫助,這裏屬性在'dynamic_article_mstr'表中不固定,屬性在構建目錄時在運行時決定,所以我不能用固定列硬編碼@tmp臨時表。屬性Ids也沒有修復它應該動態地來自'catalog_tree_mstr'表。 –