私は5つのテーブルを持つデータベースを持っています。 3つのテーブルが接続されています。SQL Serverテーブルから動的なマルチレベルXMLファイルを生成
すべてのデータがマージされる1つのテーブルを作成します。このテーブルには、レベルnrを保持する列GroupLevelがあります。各レベルは、その後のより低いレベルを保持する。
ProductID ProductLanguageID ProductDefaultShopID ProductNumber ProductName ProductPrice
[email protected]@SHOP1 LANG2 SHOP1 100101 AAA 159,61
[email protected]@SHOP1 LANG2 SHOP1 100102 BBB 159,61
[email protected]@SHOP1 LANG2 SHOP1 100105 CCC 159,61
目はグループがあります:
GroupID GroupLanguageID GroupName GroupNumber
[email protected]@SHOP1 LANG2 ABC 1
[email protected]@SHOP1 LANG2 BCD 1.01
[email protected]@SHOP1 LANG2 CDE 1.02
[email protected]@SHOP1 LANG2 DEF 1.03
第三の言語
LanguageID LanguageCode2 LanguageName LanguageNativeName
LANG1 En English English
LANG2 De German Deutsch
私も持っているグループ1は、私のテーブルの最初の製品が含まれているグループ2
を保持しています別のテーブルに接続していない2つのテーブル:
グループ関係表
GroupRelationsGroupID GroupRelationsParentID
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
グループ製品のリレーション表
GroupProductRelationGroupID GroupProductRelationProductID
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
[email protected]@SHOP1 [email protected]@SHOP1
私は、すべてのデータがマージされて一つのテーブルを作成しました。このテーブルには、レベルnrを保持する列GroupLevelがあります。各レベルは、その後のより低いレベルを保持する。グループ1は
GroupLevel GroupID GroupLanguageID GroupName GroupNumber ParentGroupID GroupProductRelationGroupID GroupProductRelationProductID ProductID ProductLanguageID ProductNumber ProductName ProductPrice
1 [email protected]@SHOP1 LANG2 ABC 1 NULL NULL NULL NULL NULL NULL NULL NULL
2 [email protected]@SHOP1 LANG2 BCD 1.01 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 457163 ProductName 299,81
2 [email protected]@SHOP1 LANG2 BCD 1.01 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 457162 ProductName 163,14
2 [email protected]@SHOP1 LANG2 DEF 1.03 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 159151 ProductName 10
2 [email protected]@SHOP1 LANG2 DEF 1.03 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 159150 ProductName 10
2 [email protected]@SHOP1 LANG2 DEF 1.02 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 159122 ProductName 309,35
3 [email protected]@SHOP1 LANG2 GGG 1.13 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1LANG2 3459652 ProductName 309,35
4 [email protected]@SHOP1 LANG2 BBB 1.14 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 [email protected]@SHOP1 LANG2 564326 ProductName 309,35
私の質問は、三番目の後のレベルのすべての項目がにマージされ、最大3つのレベル、との動的なXMLファイルを作成する方法である(付属への)第三の下の表のように、グループ2を保持していますレベル。私はまた、これらのレベルの各項目(3番目にマージされた項目)には、元々どのレベルに属しているかを示す属性が必要です。たとえば、5つのレベルと4と5のレベルが3のレベルにマージされた場合、レベル4のすべてのアイテムには、「レベル4以前」とレベル5の「レベル5」のタグが必要です。これは、そこにいくつのレベルがあるかに関係なく動作するはずです。
私は、コードを作成したが、
SELECT lvl1.GroupName AS groupName, lvl1.GroupNumber
,(
SELECT prod1.ProductName AS itemName
,prod1.ProductNumber AS itemNumber,
prod1.ProductPrice AS itemPrice,
prod1.GroupID,
prod1.GroupName
FROM #tmpFullResult AS prod1
WHERE prod1.GroupLevel=1
AND prod1.GroupID=lvl1.GroupID
FOR XML PATH('product'),ROOT('products'),TYPE
)
,(
SELECT lvl2.GroupName AS groupName, lvl2.GroupNumber
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM #tmpFullResult AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=2
AND prod.ProductID=lvl2.ProductID
AND prod.GroupID=lvl2.GroupID
FOR XML PATH('product'),ROOT('products'),TYPE
)
FROM #tmpFullResult AS lvl2
WHERE lvl2.GroupLevel=2
AND lvl2.ParentGroupID=lvl1.GroupID
group by lvl2.GroupName , lvl2.GroupNumber,lvl2.GroupID, lvl2.ProductID
FOR XML PATH('productGroup2'),TYPE
)
FROM #tmpFullResult AS lvl1
WHERE lvl1.ParentGroupID IS NULL
group by lvl1.GroupName , lvl1.GroupNumber,lvl1.GroupID, lvl1.ProductID
FOR XML PATH('productgroup1'),ROOT('root')
GO
私が行う必要がある方法の例を、必要に応じてそれは動作しません。この例のようにXMLで
select '<?xml version="1.0" encoding="ISO-8859-1" ?>' +
(
SELECT lvl1.GroupName AS groupName
,(
SELECT prod1.ProductName, prod1.ProductNumber AS itemNumber
,prod1.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod1
WHERE prod1.ProductID IS NOT NULL
AND prod1.GroupLevel=1
AND prod1.ProductID=lvl1.ProductID
AND prod1.GroupID=lvl1.GroupID
FOR XML PATH('productLevel_1'),ROOT('products'),TYPE
)
,(
SELECT lvl2.GroupName AS 'GroupName'
,(
SELECT prod2.ProductName AS ProductName ,prod2.ProductNumber AS itemNumber
,prod2.ProductPrice AS itemPrice, prod2.GroupID
FROM tmpFullResultInDesign AS prod2
WHERE prod2.ProductID IS NOT NULL
AND prod2.GroupLevel=2
AND prod2.ProductID=lvl2.ProductID
AND prod2.GroupID=lvl2.GroupID
order by groupName
FOR XML PATH('productLevel_2'),ROOT('products'),TYPE
)
,(
SELECT lvl3.GroupName AS groupName
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=3
AND prod.ProductID= lvl3.ProductID
AND prod.GroupID=lvl3.GroupID
FOR XML PATH('productLevel_3'),ROOT('products'),TYPE
)
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=3
FOR XML PATH('productLevel_previously_level_4'),ROOT('products'),TYPE
)
,(
SELECT prod.ProductName AS '@id' ,prod.ProductNumber AS itemNumber
,prod.ProductPrice AS itemPrice
FROM tmpFullResultInDesign AS prod
WHERE prod.ProductID IS NOT NULL
AND prod.GroupLevel=5
FOR XML PATH('productLevel_previously_level_5'),ROOT('products'),TYPE
)
FROM tmpFullResultInDesign AS lvl3
WHERE lvl3.GroupLevel=3
AND lvl3.ParentGroupID=lvl2.GroupID
FOR XML PATH('productGroup3'),TYPE, ELEMENTS
)
FROM tmpFullResultInDesign AS lvl2
WHERE lvl2.GroupLevel=2
AND lvl2.ParentGroupID=lvl1.GroupID
order by lvl2.GroupName
FOR XML PATH('productGroup2'),TYPE, ELEMENTS
)
FROM tmpFullResultInDesign AS lvl1
WHERE lvl1.ParentGroupID IS NULL
order by GroupNumber
FOR XML PATH('productGroup1'),ROOT('root')
)
出力:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<productGroup1>
<groupName>Kosmetik</groupName>
<productGroup2>
<GroupName>Face</GroupName>
<products>
<productLevel_2 id="Product1">
<ProductName>AAAAA!</ProductName>
<itemNumber>457162</itemNumber>
<itemPrice>1.02</itemPrice>
<GroupID>[email protected]@SHOP1</GroupID>
</productLevel_2>
<productLevel_2 id="Product2">
<ProductName>BBBBB!</ProductName>
<itemNumber>43434234</itemNumber>
<itemPrice>134.3434</itemPrice>
<GroupID>[email protected]@SHOP1</GroupID>
</productLevel_2>
</products>
<productGroup3>
<groupName>FFFFFFF</groupName>
<products>
<productLevel_3 id="Product1">
<itemNumber>[email protected]</itemNumber>
<itemPrice>1.230000000000000e+002</itemPrice>
</productLevel_3>
</products>
<products>
<productLevel_previously_level_4 id="Product1">
<itemNumber>23234545</itemNumber>
<itemPrice>34.676</itemPrice>
</productLevel_previously_level_4>
<productLevel_previously_level_4 id="Product2">
<itemNumber>23234545</itemNumber>
<itemPrice>34.676</itemPrice>
</productLevel_previously_level_4>
</products>
</productGroup3>
</productGroup2>
</productGroup1>
</root>
を
質問説明: 私は仕事が必要ですi番目のレベル(すなわち、レベルn + 1はレベルnになるはずです)。私はいくつかのレベルでの製品を持っている ...もう一度説明しよう:私はレベル1を選択した場合
level 1 + products
level 2 + products
level 3 + products ...
level n + products.
アイデアがある、1(すなわち2、3、4よりもレベルからのすべての製品に大きな... n)はレベル1に集約されます:
<productGroup1 GroupID="[email protected]@SHOP1">
<GroupName>AAA</GroupName>
<GroupLevel>1</GroupLevel>
<products>
<product>
<ProductName>CCC</ProductName>
</product>
</products>
<products>
<product>
<ProductName>Mem</ProductName>
</product>
</products>
</productGroup1>
私が選択した場合は、レベル2、レベル1はそのままで、レベルからすべての製品大きなより2(すなわち3、4 ... n)はレベル2 に集約されていますすべてのレベルで同じことが行われます(制限はありません)。
CTEをストアドプロシージャに入れることはできますか?
「マージされた」XMLのサンプルを提供できますか? – Alex