我有文档表,每行都有一个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}}
谢谢!
答案 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