SQL - 删除重复对

时间:2011-01-10 21:54:44

标签: sql sqlite graph unique distinct

我正在使用SQLite使用两列u和v来存储图形的一组无向边缘。例如:

你v

1 2

3 2

2 1

3 4

我已经使用了SELECT DISTINCT * FROM edge并删除了所有重复的行。

然而,如果我们记住这些是无向边缘,仍然有重复。在上面的例子中,边(1,2)出现两次,一次为(1,2),一次为(2,1),两者都是等价的。

我希望删除所有这些副本,只留下其中一个,(1,2)或(2,1) - 这并不重要。

任何想法如何实现这一目标?谢谢!

3 个答案:

答案 0 :(得分:6)

如果存在相同的对(反向),请使用u> v。

SELECT DISTINCT u,v
FROM table t1 
WHERE t1.u > t1.v
    OR NOT EXISTS (
        SELECT * FROM table t2 
            WHERE t2.u = t1.v AND t2.v = t1.u 
    )

答案 1 :(得分:4)

这将找到所有重复项:

SELECT t1.u, t1.v FROM table t1 INNER JOIN table t2
 ON t1.u = t2.v AND t1.v = t2.u

这将删除重复项:

DELETE FROM table t1 WHERE
  EXISTS (SELECT * FROM table t2 WHERE t2.u = t1.v AND t2.v = t1.u AND t1.u > t2.u)

请注意,这不会删除像(2,2)这样的重复项,但我认为你已经使用了SELECT DISTINCT。

答案 2 :(得分:-2)

- 测试9个数字,以便我在两个表中添加9个数字

 declare @num  int
 set @num =1
 while @num<10
 begin 
 insert into t2 values (@num)
 insert into t1 values (@num)
 set @num +=  1 
 end

- 然后在不重复的情况下耦合唯一身份

 select t1.u, t2.v
 from t1 cross join t2
 where t1.u>t2.v