Группировка результатов в SQL Server 2005 с использованием xquery - PullRequest
0 голосов
/ 03 февраля 2011

Я пытаюсь извлечь данные, чтобы использовать их в RSS-ленте базы Google, в настоящее время использующей SQL Server 2005.

Есть несколько проблем, которые я надеюсь решить!

  1. пространств имен
  2. группировка

Мой текущий 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>

Я считаю, что выполнение запроса можно ускорить, удалив лишние узлы перед поиском, и любые советы о том, как мне это сделать!

Большое спасибо

1 Ответ

1 голос
/ 03 февраля 2011

У меня нет вашей 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>
')

Получить идентификатор и имя из всех строк

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, root

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>
...