有一个表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条麻烦各位赐教啊
字段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上面建立索引。
2、更新,建议使用临时表操作,把需要更新的数据剪贴到临时表中,然后在临时表中更新完后回写到T表。
DELETE FORM T aa
WHERE aa.A in(SELECT A FORM T GROUP BY A HAVING COUNT(A)>1)
这个exist是有错误的。没有T表和后面的子查询的关联。所以这里就等效delete from T;这个语句,就就是全删除
通过楼主的sql没有看的太懂,你的目的是怎样的呀。
字段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 我的意思上面。
delete from T t2
where exists(select 1 from T t1 where t1.A=t2.A and t1.B <>t2.B)
根据楼主所述,
字段A 字段B
a 1
b 2
c 3
a 5
d 6
c 1这样的数据,是不是应该最终是得到以下结果?
字段A 字段B
b 2
d 6
则SQL应该是这样的:
delete from T t2 where exists(select 1 from T t1 where t1.A=t2.A and t1.B <>t2.B);跟楼上的一样
create table del_rowid as
select t.rowid rid from T t1 where t1.A=t2.A and t1.B <>t1.B;create index idx_del_rowid on del_rowid(rowid);
delete/*+ordered use_nl(del_rowid t)*/ t where t.rowid in (select rid from del_rowid )红色的 sql提示, 要看执行计找修改。没有实际数据,也不知道准确不准确,删了 “红色的 sql提示” 也没关系。
create table del_rowid as
select t.rowid rid from T t1 where t1.A=t1.A and t1.B <>t1.B; create index idx_del_rowid on del_rowid(rowid);
delete/*+ordered use_nl(del_rowid t)*/ t where t.rowid in (select rid from del_rowid ) 红色的 sql提示, 要看执行计找修改。没有实际数据,也不知道准确不准确,删了 “红色的 sql提示” 也没关系。
这个一定会全 表扫描T 再 delete全表扫描 delete 一定不快。
2、update (select t.b tb,x.d xd from t,x where t.a=x.c) set tb=xd; 在有主键或唯一索引的情况下,这个方法最快。
第二个方法,要加上个 hint吧?
我见过的写法,是这样:
update /*+ BYPASS_UJVC*/(select t.b tb,x.d xd from t,x where t.a=x.c) set tb=xd;