SQL:使用xpath过滤XML检索

时间:2014-10-05 09:53:31

标签: sql xml xpath

我有文档表,每行都有一个XML列Document

<Document>
   <Good GroupId="..."/>
   <Good GroupId="..."/>
   ...
</Document>

我还有临时表,其中包含GroupId个值的子集:

DECLARE @Groups TABLE (groupId VARCHAR(MAX));

接下来,我向文档表写了一个select查询,目标 - 从Document检索XML:

SELECT
    (SELECT CAST(Document.data as XML)).query('/Document/Good') AS Goods
FROM 
    Documents as Document
JOIN 
    @Numbers n ON n.number = Document.number
WHERE
    Document.type = @type
    --FOR XML AUTO, ROOT('Documents')

因此,在Goods列中,我为每个Good

获取了所有Document个项目

任务

在第3步中,我需要按Good属性过滤GroupId元素(使用@Groups) - 我需要Good所有GroupId@Groups包含在{{1}}

谢谢!

1 个答案:

答案 0 :(得分:1)

执行CROSS APPLY从XML

中提取属性值

需要使用LEFT JOIN在XML中查找商品,但不能在@Goods表中查找商品。

这是SQL小提琴:http://www.sqlfiddle.com/#!3/a6b9e/5

SELECT G.value('@GroupId', 'varchar(max)') FROM
(
SELECT
    CAST(Document.data as XML) AS Goods
FROM 
    Documents as Document
WHERE type = 1
) T
CROSS APPLY T.Goods.nodes('Document/Good') D(G)
LEFT JOIN @Groups GS
ON G.value('@GroupId', 'varchar(max)') = GS.groupId
WHERE GS.groupId IS NULL