【发布时间】:2016-10-12 22:08:30
【问题描述】:
我有一个包含 5 个表的数据库。 3 个表已连接。
我创建了一张所有数据都合并的表。此表有一个列 GroupLevel,该列保存然后级别 nr。每个级别都包含随后的较低级别,例如第 1 组拥有第 2 组。
我的第一个表包含产品:
ProductID ProductLanguageID ProductDefaultShopID ProductNumber ProductName ProductPrice
100101@@SHOP1 LANG2 SHOP1 100101 AAA 159,61
100102@@SHOP1 LANG2 SHOP1 100102 BBB 159,61
100105@@SHOP1 LANG2 SHOP1 100105 CCC 159,61
第二个有组:
GroupID GroupLanguageID GroupName GroupNumber
1@@SHOP1 LANG2 ABC 1
1.01@@SHOP1 LANG2 BCD 1.01
1.02@@SHOP1 LANG2 CDE 1.02
1.03@@SHOP1 LANG2 DEF 1.03
第三种语言
LanguageID LanguageCode2 LanguageName LanguageNativeName
LANG1 En English English
LANG2 De German Deutsch
我还有 2 个表与其他表没有任何连接:
组关系表
GroupRelationsGroupID GroupRelationsParentID
1.01@@SHOP1 1@@SHOP1
1.02@@SHOP1 1@@SHOP1
1.02@@SHOP1 1@@SHOP1
集团产品关系表
GroupProductRelationGroupID GroupProductRelationProductID
1.01@@SHOP1 576134@@SHOP1
1.01@@SHOP1 327112@@SHOP1
1.01@@SHOP1 457168@@SHOP1
1.01@@SHOP1 457220@@SHOP1
1.03@@SHOP1 457221@@SHOP1
1.03@@SHOP1 163704@@SHOP1
1.03@@SHOP1 163705@@SHOP1
1.03@@SHOP1 163706@@SHOP1
我创建了一张表,所有数据都在其中合并。该表有一个 GroupLevel 列,其中包含一个级别 nr。每个级别都包含随后的较低级别,例如第 1 组包含第 2 组,如下表所示
GroupLevel GroupID GroupLanguageID GroupName GroupNumber ParentGroupID GroupProductRelationGroupID GroupProductRelationProductID ProductID ProductLanguageID ProductNumber ProductName ProductPrice
1 1@@SHOP1 LANG2 ABC 1 NULL NULL NULL NULL NULL NULL NULL NULL
2 1.01@@SHOP1 LANG2 BCD 1.01 1@@SHOP1 1.01@@SHOP1 457163@@SHOP1 457163@@SHOP1 LANG2 457163 ProductName 299,81
2 1.01@@SHOP1 LANG2 BCD 1.01 1@@SHOP1 1.01@@SHOP1 457162@@SHOP1 457162@@SHOP1 LANG2 457162 ProductName 163,14
2 1.03@@SHOP1 LANG2 DEF 1.03 1@@SHOP1 1.03@@SHOP1 159151@@SHOP1 159151@@SHOP1 LANG2 159151 ProductName 10
2 1.03@@SHOP1 LANG2 DEF 1.03 1@@SHOP1 1.03@@SHOP1 159150@@SHOP1 159150@@SHOP1 LANG2 159150 ProductName 10
2 1.03@@SHOP1 LANG2 DEF 1.02 1@@SHOP1 1.03@@SHOP1 159122@@SHOP1 159122@@SHOP1 LANG2 159122 ProductName 309,35
3 1.13@@SHOP1 LANG2 GGG 1.13 1.03@@SHOP1 1.13@@SHOP1 3459652@@SHOP1 3459652@@SHOP1LANG2 3459652 ProductName 309,35
4 1.14@@SHOP1 LANG2 BBB 1.14 1.13@@SHOP1 1.13@@SHOP1 564326@@SHOP1 564326@@SHOP1 LANG2 564326 ProductName 309,35
我的问题是如何创建一个具有最多 3 个级别的动态 XML 文件,其中第三个级别之后的级别上的所有项目都合并到(包含到)第 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
我需要做的一个例子:
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 格式输出如下例:
<?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>1.01@@SHOP1</GroupID>
</productLevel_2>
<productLevel_2 id="Product2">
<ProductName>BBBBB!</ProductName>
<itemNumber>43434234</itemNumber>
<itemPrice>134.3434</itemPrice>
<GroupID>1.01@@SHOP1</GroupID>
</productLevel_2>
</products>
<productGroup3>
<groupName>FFFFFFF</groupName>
<products>
<productLevel_3 id="Product1">
<itemNumber>123@1</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>
问题说明: 我需要处理 n 个级别(即第 n+1 级应该进入第 n 级)。我试着再解释一次…… 我有几个级别的产品:
level 1 + products
level 2 + products
level 3 + products ...
level n + products.
这个想法是,如果我选择 1 级,所有大于 1 级的产品(即 2、3、4...n)都会聚合到 1 级:
<productGroup1 GroupID="10@@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 示例吗?
标签: sql-server xml merge