我有一张类似
的表格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条目。
答案 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);