筛选在不同列中具有相同数据的行

时间:2013-05-04 10:12:54

标签: sql

我有一些看起来像这样的数据:

 A | B
97 |556
257|803
803|257
257|323
556|97

我试图找出过滤结果的最佳方法,以便删除重复的行。例如,它仅显示行257 | 803而不是803 | 257。最好的方法是什么?

4 个答案:

答案 0 :(得分:3)

SELECT *
FROM T x
WHERE x.A < x.B
OR NOT EXISTS (
   SELECT *
   FROM T y 
   WHERE y.A = x.B AND y.B = x.A
   );

这种奇怪情况的真值表:

 A | B  | (A<B) | (NOT exists) | (A<B OR NOT exists)
---+----+-------+--------------+----------------------
97 |556 | True  | False        |  True
257|803 | True  | False        |  True
803|257 | False | False        |  False
257|323 | True  | True         |  True
556|97  | False | False        |  False

结果:

  a  |  b  
-----+-----
  97 | 556
 257 | 803
 257 | 323
(3 rows)

答案 1 :(得分:1)

Query

试试这个MYSQL
select distinct greatest(t1.A, t1.B), least(t1.A, t1.B)
from your_table t1 , your_table t2
where t1.B=t2.A and t1.A=t2.B

<强> SQL Fiddle

<强> Refer my Answer. Only the inner Query

<强> Edit

SQL SERVER 版本

select * from
(select 
case when t1.A>t1.B
then t1.A end as A1, 
case when t1.A>t1.B
then t1.B end as B1
from your_table t1 , your_table t2
where t1.B=t2.A and t1.A=t2.B)t
where t.A1 is not null

<强> SQL Fiddle

答案 2 :(得分:1)

在SQLServer2005中使用选项与CROSS APPLY运算符

SELECT *
FROM dbo.test102 t
  OUTER APPLY (
               SELECT t2.A, t2.B
               FROM dbo.test102 t2
               WHERE t.A = t2.B AND t.B = t2.A                 
               ) o               
WHERE t.A > t.B OR o.A IS NULL

SQLFiddle上的演示

OR

SELECT *
FROM dbo.test102 t LEFT JOIN dbo.test102 t2 ON t.A = t2.B AND t.B = t2.A
WHERE t.A > t.B OR t2.A IS NULL

答案 3 :(得分:-2)

在你的查询中添加一个where where - leftparam&lt; = rightparam。 它将消除所有重复的反向对。 80 | 100 ok,100 | 80删除。