我希望以此格式创建输出 xml,但无法在“子项”下添加“功能”和“类别”节点。我可以一次添加一个,但不能同时添加两个。
<Parent>
<Child>
<Features>
<Feature Id="f1" />
<Feature Id="f2" />
<Feature Id="f3" />
</Features>
<Categories>
<Category Name="c1">
<Feature>f1</Feature>
<Feature>f2</Feature>
</Category>
<Category Name="c2">
<Feature>f2</Feature>
<Feature>f3</Feature>
</Category>
<Category Name="c3">
<Feature>f2</Feature>
</Category>
</Child>
</Parent>
这是我的 SQL,用于创建两个带有 <Features>
的 XML 字符串。节点和 <Category>
节点:
DECLARE @CategoryFeatures TABLE (CategoryId VARCHAR(5), FeatureId VARCHAR(5))
INSERT INTO @CategoryFeatures VALUES ('c1', 'f1')
INSERT INTO @CategoryFeatures VALUES ('c1', 'f2')
INSERT INTO @CategoryFeatures VALUES ('c2', 'f2')
INSERT INTO @CategoryFeatures VALUES ('c2', 'f3')
INSERT INTO @CategoryFeatures VALUES ('c3', 'f2')
SELECT
(
SELECT
(
SELECT [@Id] = FeatureId
FROM CategoryFeatures
GROUP BY FeatureId
FOR XML PATH ('Feature'), ROOT ('Features'), TYPE)
FOR XML PATH ('Child'), TYPE)
FOR XML PATH ('Parent')
SELECT
(
SELECT
(
SELECT [@Name] = cat.CategoryId,
(
SELECT Feature = cf.FeatureId
FROM CategoryFeatures cf
WHERE cf.CategoryId = cat.CategoryId
FOR XML PATH (''), TYPE)
FROM CategoryFeatures cat
GROUP BY cat.CategoryId
FOR XML PATH ('Category'), ROOT ('Categories'), TYPE)
FOR XML PATH ('Child'), TYPE)
FOR XML PATH ('Parent')
如何使这两个节点处于同一级别,使其看起来像上面的预期输出?谢谢。
最佳答案
一种可能性是子查询的狂欢。
SELECT (SELECT (SELECT cf1.featureid "Feature/@Id"
FROM (SELECT DISTINCT
cf0.featureid
FROM @categoryfeatures cf0) cf1
FOR XML PATH(''),
TYPE)
FOR XML PATH('Features'),
TYPE),
(SELECT (SELECT cf1.categoryid "Category/@Name",
(SELECT cf2.featureid "Feature"
FROM @categoryfeatures cf2
WHERE cf2.categoryid = cf1.categoryid
FOR XML PATH(''),
TYPE) "Category"
FROM (SELECT DISTINCT
cf0.categoryid
FROM @categoryfeatures cf0) cf1
FOR XML PATH(''),
TYPE)
FOR XML PATH('Categories'),
TYPE)
FOR XML PATH('Child'),
ROOT('Parent');
关于sql-server - SQL Server XML添加多个不同类型的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54356497/