2016-10-20 4 views
7

Головоломка - это выбрать уникальные пары. Синтаксис в следующем примере для Mssqlsql unique records puzzle

declare @t table (a int, b int) 

insert into @t (a,b) values (1,2) 
insert into @t (a,b) values (2,1) 
insert into @t (a,b) values (1,3) 
insert into @t (a,b) values (3,1) 
insert into @t (a,b) values (5,6) 


select * from @t -- it outputs 5 records. 

Мне нужно, чтобы получить уникальные пары только независимо от того, а, б, который должен дать мне три записи

Вывод должен быть

(1,2),(1,3),(5,6) 

Я вне идеи и оценю помощь :)

ответ

3
select  distinct 

      case when a<b then a else b end 
      ,case when a<b then b else a end 

from  @t 
; 
10

в одну сторону (demo) будет

SELECT DISTINCT v.a, 
       v.b 
FROM @t 
     CROSS APPLY (VALUES(a,b), 
          (b,a)) v(a, b) 
WHERE v.a <= v.b 
3

Вы не запрашивали за него, но это будет сохранять порядок столбцов, т.е. всегда возвращает существующую строку:

select a,b 
from @t as t1 
where not exists(
    select * from @t as t2 
    where t1.a = t2.b 
    and t1.b = t2.a 
    and t1.a > t2.a 
); 
+0

Заказ никогда не гарантирован, если вы не имеете 'заказа by' пункт. –

+0

@ShannonSeverance: здесь 'order' означает порядок столбцов, т. Е. Когда есть только' (5,1) 'другие решения возвращают' (1,5) ', которых не существует. Отредактировал мой ответ. – dnoeth