[英]Grouping results in SQL Server 2005 using xquery
我正在嘗試提取數據,以在當前使用SQL Server 2005的google base的RSS提要中使用。
我們有一些問題,希望可以解決!
我當前的sql如下:
SELECT [xml].query('
<Item xmlns:g="a">
<Title>{ data(*/*/*/Title) }</Title>
<g:id>{ sql:column("ReportingCode") }</g:id>
</Item>
')
FROM esh_xml
where [Xml].value('(/*/*/*/Attributes/Attribute[@Description="Category"][text()="MasterMix"])[1]','nvarchar(2000)') is not null
作為當前查詢的輸出,我得到了成千上萬的結果行,即
<item xmlns:g="a"><title>blah blah</title><g:id>asdasd<g:id></item>
我想要的輸出是
<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Mastermixdigital.com Product Feed </title>
<link> http://www.mysite.com/ </link>
<description>mastermix latest release feed </description>
<item xmlns:g="a">
<title>blah blah</title>
<g:id>asdasd<g:id>
</item>
<item xmlns:g="a">
<title>blah blah</title>
<g:id>asdasd<g:id>
</item>
<item xmlns:g="a">
<title>blah blah</title>
<g:id>asdasd<g:id>
</item>
</channel>
</rss>
我相信另一件事是,可以通過在搜索之前刪除冗余節點來加快查詢的執行速度,以及有關如何進行此操作的任何提示!
非常感謝
我沒有您的xml結構或表,所以我創建了一個示例來展示您可以做什么。
設置示例數據,兩行,每行xml中有兩個項目,第一行中的一個重復,第二行中的一個重復。
declare @T table (ID int identity, [xml] xml)
insert into @T ([xml])
values ('
<root>
<item>
<id>1</id>
<name>Name 1</name>
</item>
<item>
<id>2</id>
<name>Name 2</name>
</item>
</root>
')
insert into @T ([xml])
values ('
<root>
<item>
<id>1</id>
<name>Name 1</name>
</item>
<item>
<id>3</id>
<name>Name 3</name>
</item>
</root>
')
從所有行獲取ID和名稱
select
r.i.value('id[1]', 'int') as id,
r.i.value('name[1]', 'varchar(10)') as name
from @T as T
cross apply T.[xml].nodes('root/item') r(i)
結果,四行
id name
1 Name 1
2 Name 2
1 Name 1
3 Name 3
刪除重復項的相同查詢
select distinct
r.i.value('id[1]', 'int') as id,
r.i.value('name[1]', 'varchar(10)') as name
from @T as T
cross apply T.[xml].nodes('root/item') r(i)
結果三行
id name
1 Name 1
2 Name 2
3 Name 3
使用xml路徑(根)將行連接回xml
select distinct
r.i.value('id[1]', 'int') as id,
r.i.value('name[1]', 'varchar(10)') as name
from @T as T
cross apply T.[xml].nodes('root/item') r(i)
for xml path('item'), root('root')
結果xml
<root>
<item>
<id>1</id>
<name>Name 1</name>
</item>
<item>
<id>2</id>
<name>Name 2</name>
</item>
<item>
<id>3</id>
<name>Name 3</name>
</item>
</root>
帶名稱空間
;with xmlnamespaces('a' as g)
select distinct
r.i.value('id[1]', 'int') as [g:id],
r.i.value('name[1]', 'varchar(10)') as name
from @T as T
cross apply T.[xml].nodes('root/item') r(i)
for xml path('item'), root('root')
結果
<root xmlns:g="a">
<item>
<g:id>1</g:id>
<name>Name 1</name>
</item>
<item>
<g:id>2</g:id>
<name>Name 2</name>
</item>
<item>
<g:id>3</g:id>
<name>Name 3</name>
</item>
</root>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.