【问题标题】:How to eliminate duplication with two columns in a table如何消除表中两列的重复
【发布时间】:2012-09-05 19:21:17
【问题描述】:

我有这张桌子

CREATE TABLE T
(No1 INT,
 No2 INT
)

INSERT INTO T (No1, No2) VALUES (1, 2)

INSERT INTO T (No1, No2) VALUES (2, 1)

INSERT INTO T (No1, No2) VALUES (3, 4)

INSERT INTO T (No1, No2) VALUES (4, 3)

INSERT INTO T (No1, No2) VALUES (5, 6)

INSERT INTO T (No1, No2) VALUES (6, 5)

INSERT INTO T (No1, No2) VALUES (1, 6)

INSERT INTO T (No1, No2) VALUES (6, 1)

    No1 No2
    1   2 
    2   1
    3   4
    4   3
    5   6
    6   5
    1   6
    6   1

我想要的是消除具有相同值但在另一个字段中的行。对我来说 No1=1 No2=2 和 No1=2 No2=1 是一回事。最后我想要这个结果。

No1 No2
1   2
3   4
5   6
1   6

我尝试了很多东西,也进行了很多搜索,但一无所获。我发现的唯一方法是使用光标。当我玩数百万条记录时,它非常慢。有没有办法通过查询来做到这一点?

谢谢。

【问题讨论】:

  • 什么 RDBMS 和版本?此外,一旦您删除了欺骗,您可以在 No1 No2 上放置一个唯一索引并在 No1 > No2 上放置一个约束,以确保它们仅以一种方式存储。
  • 您是否有机会检查好友请求?因为我也有同样的问题! :)
  • 当你说你想“消除”这些行时,你是想从表中删除它们还是只是从选择语句中排除它们?
  • @Martin 可能需要是 No1 >= No2
  • @RedFilter - 是的,我根据示例数据做了一个假设,因为没有No1 = No2

标签: sql duplicates row


【解决方案1】:
select t1.*
from MyTable t1
left outer join MyTable t2 on t1.No1 = t2.No2 and t1.No2 = t2.No1
where t2.No2 is null
    or t1.No1 <= t2.No1

SQL Fiddle Example

【讨论】:

    【解决方案2】:

    Oracle 有两个非常有用的函数,LEAST 和 GREATEST:

    select distinct least(no1, no2), greatest(no1, no2)
    from t
    

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 2020-02-21
      • 2019-04-21
      相关资源
      最近更新 更多