Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Xquery distinst values из XML  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
SQL 2005

declare @x xml;
set @x='<BSROOT><BST><BSID>174</BSID></BST><BST><BSID>90</BSID></BST><BST><BSID>127</BSID></BST><BST><BSID>121</BSID></BST></BSROOT>';


такой запрос полностью менят порядок следования значений из XML

результат
90
121
127
174


вместо
174
90
127
121


соответствено вопрос :
как организовать запрос что не менялся порядок и присутствовал Distinst?
если возможность не использовать CTE ?
Спасибо
31 июл 12, 00:19    [12937770]     Ответить | Цитировать Сообщить модератору
 Re: Xquery distinst values из XML  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 5975
А distinct и в обычном sql никогда не гарантировал сохранения какого-либо порядка (относительно вставки, или чего-то еще):
create table tb_foo (n int not null)
create index i$tb_foo on tb_foo (n asc)
insert into tb_foo values (6);
insert into tb_foo values (6);
insert into tb_foo values (8);
insert into tb_foo values (5);
insert into tb_foo values (12);
insert into tb_foo values (6);
insert into tb_foo values (12);
insert into tb_foo values (100);
select distinct n from tb_foo;

n
-----------
5
6
8
12
100

(5 row(s) affected)
как организовать запрос что не менялся порядок и присутствовал Distinst?

Как-то так:
declare @x xml;
set @x='<BSROOT><BST><BSID>174</BSID></BST><BST><BSID>90</BSID></BST><BST><BSID>127</BSID></BST><BST><BSID>121</BSID></BST><BST><BSID>90</BSID></BST></BSROOT>';
;with cte as (
  select
    row_number() over(order by (select 1)) ord,
    row_number() over(partition by f.n order by f.n) [rank],
    f.n
  from @x.nodes('//BSID') t(n)
  cross apply (
    select t.n.value('text()[1]','int')
  )f(n)
)
select n from cte where [rank]=1 order by ord

если возможность не использовать CTE ?

А чем вам CTE не угодили?
31 июл 12, 06:45    [12938150]     Ответить | Цитировать Сообщить модератору
 Re: Xquery distinst values из XML  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
declare @x xml;
declare @p xml;
set @x='<BSROOT><BST><BSID>174</BSID></BST><BST><BSID>90</BSID><BST><BSID>174</BSID></BST></BST><BST><BSID>127</BSID></BST><BST><BSID>121</BSID></BST><BST><BSID>90</BSID></BST><BST><BSID>121</BSID></BST></BSROOT>';
set @p=(select @x.query('for $l in distinct-values(BSROOT/BST/BSID)  return <BST><BSID>{$l}</BSID></BST>') );
SELECT DATA.Info.value('.','bigint')
                FROM    @p.nodes('/BST/BSID') as DATA(Info);


так сделал
не самое лучшее решение но всё же
31 июл 12, 10:18    [12938648]     Ответить | Цитировать Сообщить модератору
 Re: Xquery distinst values из XML  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2996
просто так
declare @x xml;
Declare @T Table (
	i Int Identity (1,1)
	, value Int Unique With (Ignore_Dup_key = On)
)
	
set @x='<BSROOT><BST><BSID>174</BSID></BST><BST><BSID>90</BSID></BST><BST><BSID>127</BSID></BST><BST><BSID>121</BSID></BST><BST><BSID>90</BSID></BST></BSROOT>';
;with 
	cte 
	as (  
		select    
			f.n  
		from 
			@x.nodes('//BSID') t(n)  
		cross apply (select t.n.value('text()[1]','int')  )f(n))
Insert Into @t(value)
select 
	n 
from 
	cte 


Select * From @t order by i
31 июл 12, 10:56    [12938934]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить