SQL Sserver:两列具有不同顺序的相同值,只需要不同的组合

时间:2015-09-22 18:12:51

标签: sql sql-server

我在SQL Server中有这样的表

src     destination
-------------------
A               B
B               A
A               D
D               A
B               D
D               B

我想要这样的结果

src     destination
-------------------
A               B
A               D
B               D

3 个答案:

答案 0 :(得分:2)

有几种不同的方法可以实现这一目标。可能表现最佳的是union all not exists

select src, dest
from table t
where src < dest
union all
select dest, src
from table t
where dest > src and
      not exists (select 1 from table t2 where t.src = t2.dest and t.dest = t2.src);

注意:这假设您的数据没有重复(与样本数据的情况一样)。

答案 1 :(得分:0)

为了扩展戈登的答案,这可能是一个更好的解决方案。 Gordon的答案不会发现srcdestination具有相同值的情况,并且如果没有相反的对应物,它也会导致重复的结果。这应该更好:

Select  A.src, A.destination
From    Table   A
Join    Table   B   On  A.src = B.destination
                    And A.destination = B.src
Where   A.src < B.src

Union

Select  src, destination
From    Table
Where   src = destination

Union

Select  src, destination
From    Table   A
Where   Not Exists 
(
    Select  *
    From    Table   B
    Where   A.src = B.destination
    And     A.destination = B.src
)

答案 2 :(得分:0)

我知道,这是旧文章,但是我的回答可能会帮助正在寻找类似问题的解决方案的人。

在这里,借助case语句,我们可以删除两列上的重复项

select distinct 
case when "src" < "destination" then "src" else "destination" END as src, 
case when "src" < "destination" then "destination" else "src" END as destination
from trip

Sql Fiddle链接:http://sqlfiddle.com/#!4/c2d17/1