1

我有一张看起来像的桌子

col1 col2 col3
 xy 0.1
 yx 0.1
 yz 0.2
 zy 0.2

…………

(x,y,0.1) 等价于 (y,x,0.1) 因此必须删除其中之一。

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

4

3 回答 3

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更容易理解。

于 2013-06-25T13:40:48.930 回答
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
于 2013-06-25T13:33:50.643 回答
1

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

delete from mytable where (col1,col2)in(sel col2,col1 from mytable where col1>col2);
于 2013-06-25T15:29:53.937 回答