从SQL表中删除重复项

时间:2013-06-25 13:28:33

标签: mysql sql

我有一张类似

的表格
col1     col2      col3
 x         y       0.1
 y         x       0.1
 y         z       0.2
 z         y       0.2

.......

(x,y,0.1)相当于(y,x,0.1),因此必须删除其中一个。

基本上,表格就像一个矩阵。我需要摆脱矩阵对角线上方/下方的所有条目。该表有100mil条目=>结果将有50mil条目。

3 个答案:

答案 0 :(得分:3)

好吧,如果你知道两个条目都在那里,你可以这样做:

delete from t
    where col1 > col2;

如果其中一些可能已经丢失,而您想保留另一个:

delete from t
   where col1 > col2 and
         exists (select 1
                 from (select 1
                       from t t2
                       where t2.y = t.x and t2.x = t.y
                      )
                )

“double”select是一种解决MySQL限制的黑客攻击,你不能直接引用delete中使用的子查询中的修改表。

编辑:

正如Ypercube指出的那样,join子句可能更好:

delete t
    from t join
         t t2
         on t2.y = t.x and t2.x = t.y and
            t.y > t.x;

我实际上发现in更容易理解。

答案 1 :(得分:1)

尝试多表DELETE

语法并不容易。类似的东西(假设你的表名为tbl):

DELETE tbl FROM tbl, tbl AS t2
    WHERE tbl.col1 = t2.col2 
        AND tbl.col2 = t2.col1 
        AND tbl.col3 = t2.col3
        AND tbl.col1 > tbl.col2

答案 2 :(得分:1)

Sylvain的解决方案应该有效。这是使用SubQ的替代方案。

delete from mytable where (col1,col2)in(sel col2,col1 from mytable where col1>col2);