有一个表T如下
字段A 字段B
a 1
b 2
c 3
a 5
d 6
c 1
需要删除符合如下条件的数据,请问有什么好sql么
条件为 select * from T t1,T t2 where t1.A=t2.A and t1.B<>t2.B
整表将近4000万条数据,我使用的SQL delete from T where exists(select 1 from T t1,T t2 where t1.A=t2.A and t1.B<>t2.B) ,半天都没反应。。。请教该如何写SQL能够节省运行时间
而存在一个配置表X,里面的数据规定了
字段C 字段D
a 1
b 2
c 3
d 6
其中的字段A里面的数据都是唯一的,如果根据表X来update表A,又该如何解决呢
T中数据4000万条,而X中数据为600条
麻烦各位赐教啊
------最佳解决方案--------------------
问题一:删除
1、首先 楼主的这个语句:delete from T where exists(select 1 from T t1,T t2 where t1.A=t2.A and t1.B <>t2.B)
是有问题的,你这个语句会把整个表清空的。
2、你的要求是要删掉:对应相同的字段A,字段B不相同的记录的所有记录,如
a 1
a 2
a 1
b 3
c 1
c 2
删除后的结果就是,只剩 b 3
那可用如下脚本:
SELECT A,B
FROM(
SELECT T.*,
COUNT(*) OVER(PARTITION BY A, B) AS RNUM_1,
COUNT(*) OVER(PARTITION BY A) AS RNUM_2
FROM T
)
WHERE RNUM_1 < RNUM_2
3、为了提高效率,建议在字典A上面建立索引。
------其他解决方案--------------------
没想到好办法,顶一下,
------其他解决方案--------------------
问题二:更新
1、建议表T、表X分别对字段A和字段C建了索引,如果表X的字段C为主键,则X不用建索引了
2、更新,建议使用临时表操作,把需要更新的数据剪贴到临时表中,然后在临时表中更新完后回写到T表。
------其他解决方案--------------------
谢谢2楼回答,不过还是看不太懂。。。。为什么没有delete语句
------其他解决方案--------------------
to 3楼,我已经将需要更新的数据插入临时表,并且已经更新好了,问题是怎么删除原表中的那些需要更新的数据呢
------其他解决方案--------------------
第一个
DELETE FORM T aa
WHERE aa.A in(SELECT A FORM T GROUP BY A HAVING COUNT(A)>1)
------其他解决方案--------------------
to 6楼,需要删除的数据有66万多,这样的语句是否意味着在4000万的记录中找66万条记录来删除呢
------其他解决方案--------------------
关注
------其他解决方案--------------------
各位大哥不要睡觉啊,跪求啊
------其他解决方案--------------------