我有一些看起来像这样的数据:
A | B
97 |556
257|803
803|257
257|323
556|97
我试图找出过滤结果以删除重复行的最佳方法。例如,它只显示行 257|803 而不是 803|257。最好的方法是什么?
我有一些看起来像这样的数据:
A | B
97 |556
257|803
803|257
257|323
556|97
我试图找出过滤结果以删除重复行的最佳方法。例如,它只显示行 257|803 而不是 803|257。最好的方法是什么?
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)
试试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
Edit
SQL 服务器版本
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
在 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上的演示
或者
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
在您的查询中再添加一个 where 条件 - leftparam<=rightparam。它将消除所有重复的反向对。80|100 正常,100|80 已删除。