SQL - 删除重复对

Jon*_*lis 6 sql sqlite graph unique distinct

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

紫外线

1 2

3 2

2 1

3 4

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

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

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

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

mos*_*tar 8

如果存在相同的对(反向),请使用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 
    )
Run Code Online (Sandbox Code Playgroud)


Lar*_*tig 4

这将找到所有重复项:

SELECT t1.u, t1.v FROM table t1 INNER JOIN table t2
 ON t1.u = t2.v AND t1.v = t2.u
Run Code Online (Sandbox Code Playgroud)

这将删除重复项:

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 您可能想澄清您选择的 *哪个* u 和 v。 (2认同)