首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

关于两表关联的update及delete的有关问题

2012-12-27 
关于两表关联的update及delete的问题有一个表T如下字段A字段Ba1b2c3a5d6c1需要删除符合如下条件的数据,请

关于两表关联的update及delete的问题
有一个表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万条记录来删除呢
[其他解释]
关注
[其他解释]
各位大哥不要睡觉啊,跪求啊
[其他解释]
引用:
问题一:删除 
1、首先 楼主的这个语句:delete? from T where exists(select 1 from T t1,T t2 where t1.A=t2.A and t1.B <>t2.B) 


是有问题的,你这个语句会把整个表清空的。 




delete  from T where exists(select 1 from T t1,T t2 where t1.A=t2.A and t1.B <>t2.B)  
这个exist是有错误的。没有T表和后面的子查询的关联。所以这里就等效delete from T;这个语句,就就是全删除


通过楼主的sql没有看的太懂,你的目的是怎样的呀。

[其他解释]
有一个表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 

我的意思上面。。。。
[其他解释]
引用:
引用:
问题一:删除 
1、首先 楼主的这个语句:delete  from T where exists(select 1 from T t1,T t2 where t1.A=t2.A and t1.B <>t2.B) 
是有问题的,你这个语句会把整个表清空的。 




delete  from T where exists(select 1 from T t1,T t2 where t1.A=t2.A and t1.B <>t2.B)  
这个exist是有错误的。没有T表和后面的子查询的关联。所以这里就等效delete from T;这个语句,就就是全删除 


delete  from T t2 
where exists(select 1 from T t1 where t1.A=t2.A and t1.B <>t2.B)

[其他解释]
楼上的啥意思啊
[其他解释]
1,删除
根据楼主所述,
字段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);

跟楼上的一样
[其他解释]
2,更新

没看懂到底要得到什么样的逻辑..
[其他解释]
学习看看,路过一下!
[其他解释]
用 rowid 更快
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提示” 也没关系。

[其他解释]
用12楼和14楼给的SQL在运行,不知道结果如何


[其他解释]
delete from T t2 where exists(select 1 from T t1 where t1.A=t2.A and t1.B <>t2.B); 
这个一定会全 表扫描T 再 delete

全表扫描 delete 一定不快。
[其他解释]
用 rowid 更快 
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提示” 也没关系。
[其他解释]
没人来解答了吗。。。
[其他解释]
谢谢楼上兄弟,我再尝试下
[其他解释]
to 楼上,已经建了临时表,而且将表中数据更新,问题是如何删除原表中数据呢
[其他解释]
楼主,你是可以建一张临时表,在通过临时表来删除
[其他解释]

引用:
1、要评估一下数据量,大体确认一下删除的数据量有多大,才能确定最优的删除方法
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; 
[其他解释]
1、要评估一下数据量,大体确认一下删除的数据量有多大,才能确定最优的删除方法
2、update (select t.b tb,x.d xd from t,x where t.a=x.c) set tb=xd; 在有主键或唯一索引的情况下,这个方法最快。

热点排行
Bad Request.