2016-05-31 4 views
1

から階層的なXMLを作成します。は、私は3つのテーブルを持つSQL Serverデータベースを持っていると私は、これらのテーブルから階層構造を持つXMLファイルを作成する必要があるSQL Serverテーブル

ProductID ProductLanguageID ProductDefaultShopID ProductNumber ProductName ProductPrice 
------------------------------------------------------------------------------------------ 
[email protected]@Inc LANG2    Inc     100101  ABC   159,61 
[email protected]@Inc LANG2    Inc     100102  BCD   159,61 
[email protected]@Inc LANG2    Inc     100105  FRE   159,61 
[email protected]@Inc LANG2    Inc     100106  GDE   159,61 

秒が持っているグループ

GroupID  GroupLanguageID GroupName   GroupNumber 
------------------------------------------------------------ 
[email protected]@Inc  LANG2    AAA    1 
[email protected]@Inc LANG2    BBB    1.01 
[email protected]@Inc LANG2    CCC    1.02 
[email protected]@Inc LANG2    DDD    1.03 
[email protected]@Inc LANG2    GGG    1.12 

への接続を持っているドント第三の言語

LanguageID LanguageCode2 LanguageName 
---------------------------------------- 
LANG1  ES    Spain 
LANG2  EN    English 

私も2つのテーブルを持っている:

一つのテーブルには、製品が含まれています別のテーブル:

私はT-SQLとC#(ASPを使用することができ

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <productgroup1> 
    <groupname>AAA</groupname> 
    <productgroup2> 
     <groupname>BBB</groupname> 
     <productgroup3> 
     <groupname>CCC</groupname> 
     <products> 
      <product> 
      <itemName>ABC</itemName> 
      <itemNumber>100303</itemNumber> 
      <itemPrice>159.61</itemPrice> 
      <ExtraProductgroup> 
       <extraProductgroupName>GGG</extraProductgroupName> 
       <itemName>FRE</itemName> 
       <itemNumber>100305</itemNumber> 
       <itemPrice>159.61</itemPrice> 
      </ExtraProductgroup> 
      </product> 
     <product> 
      <itemName>BCD</itemName> 
      <itemNumber>100302</itemNumber> 
      <itemPrice>159.61</itemPrice> 
      </product> 
     </products> 
     </productgroup3> 
    </productgroup2> 
    </productgroup1> 
</root> 

グループ関係表

GroupRelationsGroupID GroupRelationsParentID 
-------------------------------------------- 
[email protected]@Inc    [email protected]@Inc 
[email protected]@Inc    [email protected]@Inc 
[email protected]@Inc    [email protected]@Inc 
[email protected]@Inc    [email protected]@Inc 

グループ製品のリレーション表

GroupProductRelationGroupID GroupProductRelationProductID 
------------------------------------------------------------- 
[email protected]@Inc      [email protected]@Inc 
[email protected]@Inc      [email protected]@Inc 
[email protected]@Inc      [email protected]@Inc 

は、XML出力は次のような構造を持っている必要があります。ネットWebフォーム)。助けて!!! :-)

+1

私はそのデータから、そのXMLを取得する方法を参照してくださいません。たとえば、itemColorはどこから来たのですか? ExtraProductgroupはどうですか?誰かにチャンスを与えたいなら、少なくとも与えられた入力から手作業で所望の出力を作成してください。それ以外の場合は、ここで推測しています。 –

+0

あなたはProductNumberとProductIDを持っていてProductIDは '@@ Inc'の番号です - 実際の* IDは何ですか?奇妙に思えます...どちらも他のデータのどこかに見つけられません。プロダクトはどのようにグループに結びついていますか?グループは階層的にネストされているようです。最大の深さはありますか?グループテーブルに含まれていないグループとグループの関係保留ID ... **このサンプルデータをフィッティングして、このデータにフィッティングしてください** ** [MCVE](http:// stackoverflow。 COM /ヘルプ/ MCVE)(コードまたは[フィドル](www.sqlfiddle.com) – Shnugo

答えて

0

私はそれらがLEVEL2グループに関連しているときにこのstructurに満足し得ることを本当に疑いI、...はなぜgroupLevel3以下の製品であることを、認めなければなりませんか?なぜABCとBCDは同じレベルに位置していますか? ExtraGroupはどのようにして発見されましたか?

このソリューションは、一般的に、すべてのデータを解決しませんが - 少なくとも - 与えられたデータとまったく希望の結果を戻します。

CREATE TABLE #Products(ProductID VARCHAR(50),ProductLanguageID VARCHAR(50),ProductNumber INT, ProductName VARCHAR(50), ProductPrice DECIMAL(14,4)); 
INSERT INTO #Products VALUES 
('[email protected]@Inc','LANG2',100101,'ABC',159.61) 
,('[email protected]@Inc','LANG2',100102,'BCD',159.61) 
,('[email protected]@Inc','LANG2',100105,'FRE',159.61) 
,('[email protected]@Inc','LANG2',100106,'GDE',159.61) 
; 

CREATE TABLE #Groups(GroupID VARCHAR(50),GroupLanguageID VARCHAR(50),GroupName VARCHAR(50),GroupNumber DECIMAL(5,2)); 
INSERT INTO #Groups VALUES 
('[email protected]@Inc','LANG2','AAA',1) 
,('[email protected]@Inc','LANG2','BBB',1.01) 
,('[email protected]@Inc','LANG2','CCC',1.02) 
,('[email protected]@Inc','LANG2','DDD',1.03) 
,('[email protected]@Inc','LANG2','GGG',1.12) 
; 

CREATE TABLE #Languages(LanguageID VARCHAR(50),LanguageCode2 VARCHAR(50),LanguageName VARCHAR(50)); 
INSERT INTO #Languages VALUES 
('LANG1','ES','Spain') 
,('LANG2','EN','English'); 

CREATE TABLE #GroupRelations(GroupRelationsGroupID VARCHAR(50),GroupRelationsParentID VARCHAR(50)); 
INSERT INTO #GroupRelations VALUES 
('[email protected]@Inc','[email protected]@Inc') 
,('[email protected]@Inc','[email protected]@Inc') 
,('[email protected]@Inc','[email protected]@Inc') 
,('[email protected]@Inc','[email protected]@Inc'); 

CREATE TABLE #GroupProductRelations(GroupProductRelationGroupID VARCHAR(50),GroupProductRelationProductID VARCHAR(50)); 
INSERT INTO #GroupProductRelations VALUES 
('[email protected]@Inc','[email protected]@Inc') 
,('[email protected]@Inc','[email protected]@Inc') 
,('[email protected]@Inc','[email protected]@Inc'); 


GO 

WITH TopGroups AS 
(
    SELECT gr.GroupID 
    FROM #Groups AS gr 
    WHERE NOT EXISTS(SELECT 1 FROM #GroupRelations AS x WHERE gr.GroupID = x.GroupRelationsGroupID) 
) 
,recGroup AS 
(
    SELECT 1 AS GroupLevel 
      ,g.GroupID 
      ,g.GroupLanguageID 
      ,g.GroupName 
      ,g.GroupNumber 
      ,gr.GroupRelationsParentID AS ParentGroupID 
    FROM #Groups AS g 
    LEFT JOIN #GroupRelations AS gr ON g.GroupID=gr.GroupRelationsGroupID 
    WHERE gr.GroupRelationsParentID IS NULL 
    UNION ALL 
    SELECT prev.GroupLevel + 1 
      ,gNext.GroupID 
      ,gNext.GroupLanguageID 
      ,gNext.GroupName 
      ,gNext.GroupNumber 
      ,grNext.GroupRelationsParentID 
    FROM #GroupRelations AS grNext 
     INNER JOIN #Groups AS gNext ON grNext.GroupRelationsGroupID=gNext.GroupID 
     INNER JOIN recGroup AS prev ON grNext.GroupRelationsParentID=prev.GroupID 
) 
SELECT * 
INTO #tmpFullResult 
FROM recGroup 
LEFT JOIN #GroupProductRelations AS gp ON recGroup.GroupID=gp.GroupProductRelationGroupID 
LEFT JOIN #Products AS p ON gp.GroupProductRelationProductID=p.ProductID 
LEFT JOIN #Languages AS l ON p.ProductLanguageID=l.LanguageID; 

SELECT * FROM #tmpFullResult; 

SELECT lvl1.GroupName AS groupName 
     ,(  
     SELECT lvl2.GroupName AS groupName 
       ,(
       SELECT lvl3.GroupName AS groupName 
        ,(
         SELECT prod.ProductName AS itemName 
           ,prod.ProductNumber AS itemNumber 
           ,prod.ProductPrice AS itemPrice 
           ,(
            SELECT prodExtra.GroupName AS extraProductGroupName 
              ,prodExtra.ProductName AS itemName 
              ,prodExtra.ProductNumber AS itemNumber 
              ,prodExtra.ProductPrice AS itemPrice 
            FROM #tmpFullResult AS prodExtra 
            WHERE prodExtra.ProductID IS NOT NULL 
             AND prodExtra.GroupLevel=5 
            FOR XML PATH('ExtraProductgroup'),TYPE 
           ) 
         FROM #tmpFullResult AS prod 
         WHERE prod.ProductID IS NOT NULL 
          AND prod.GroupLevel<5 
         FOR XML PATH('product'),ROOT('products'),TYPE 
        ) 
       FROM #tmpFullResult AS lvl3 
       WHERE lvl3.GroupLevel=3 AND lvl3.ParentGroupID=lvl2.GroupID 
       FOR XML PATH('productGroup3'),TYPE 
       ) 
     FROM #tmpFullResult AS lvl2 
     WHERE lvl2.GroupLevel=2 AND lvl2.ParentGroupID=lvl1.GroupID 
     FOR XML PATH('productGroup2'),TYPE 
     ) 
FROM #tmpFullResult AS lvl1 
WHERE lvl1.ParentGroupID IS NULL 
FOR XML PATH('productgroup1'),ROOT('root') 
GO 
DROP TABLE #tmpFullResult; 
DROP TABLE #GroupProductRelations 
DROP TABLE #Groups 
DROP TABLE #GroupRelations 
DROP TABLE #Languages 
DROP TABLE #Products 

結果

<root> 
    <productgroup1> 
    <groupName>AAA</groupName> 
    <productGroup2> 
     <groupName>BBB</groupName> 
     <productGroup3> 
     <groupName>CCC</groupName> 
     <products> 
      <product> 
      <itemName>ABC</itemName> 
      <itemNumber>100101</itemNumber> 
      <itemPrice>159.6100</itemPrice> 
      <ExtraProductgroup> 
       <extraProductGroupName>GGG</extraProductGroupName> 
       <itemName>FRE</itemName> 
       <itemNumber>100105</itemNumber> 
       <itemPrice>159.6100</itemPrice> 
      </ExtraProductgroup> 
      </product> 
      <product> 
      <itemName>BCD</itemName> 
      <itemNumber>100102</itemNumber> 
      <itemPrice>159.6100</itemPrice> 
      <ExtraProductgroup> 
       <extraProductGroupName>GGG</extraProductGroupName> 
       <itemName>FRE</itemName> 
       <itemNumber>100105</itemNumber> 
       <itemPrice>159.6100</itemPrice> 
      </ExtraProductgroup> 
      </product> 
     </products> 
     </productGroup3> 
    </productGroup2> 
    </productgroup1> 
</root> 
+0

@AntonTredderまあ、いつか私たちは、私は現時点では理解していない何...彼らがそうであるように、物事を取らなければならない:この質問が解決されます(与えられたデータ=>出力期待される)かどうません:?。なぜ – Shnugo

+0

@AntonTredderこれは(あまりにもあなたの期待される出力に編集オプションを使用)し、それらをいじる反映するために、あなたの質問にあなたのサンプルデータにいくつかのより多くの行を追加してくださいIあなたが欲しい/必要としていることを本当に理解していない... – Shnugo

+0

@AntonTredder、ちょうど同じ質問をもう一度置いた。これは、この複雑な質問にはるかに魅力を引く良い判断である。あなたの最後の変更をロールバックしてこの質問を閉じる。私がかなり投資したので与えられたデータを使って与えられた質問を実際に解決しました。私はあなたに私に投票してください(余分なアクション)この質問を閉じるために受け入れチェックをチェックしてください。私はあなたの新しい質問(明日)にポップアップし、そこにあなたを手伝ってくれます - もし私ができるなら... Thx – Shnugo

関連する問題