我在SQL Server中有这样的表
src destination
-------------------
A B
B A
A D
D A
B D
D B
我想要这样的结果
src destination
-------------------
A B
A D
B D
答案 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的答案不会发现src
和destination
具有相同值的情况,并且如果没有相反的对应物,它也会导致重复的结果。这应该更好:
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