ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 【求助】谁能帮我看看这个SQL出了什么问题?

标题: [SQL] 【求助】谁能帮我看看这个SQL出了什么问题?
离线 demonskull
初级会员



精华贴数 0
个人空间 0
技术积分 81 (19700)
社区积分 7 (13442)
注册日期 2006-3-30
论坛徽章:0
      
      

发表于 2008-9-24 10:50 
【求助】谁能帮我看看这个SQL出了什么问题?

还有个奇怪的问题,如下所示。
用SELECT可以发现有3条记录,但是在DELETE的时候却是0条记录被删除。现在在这个用户下有不少这样的问题,这个正常么?

SQL> select count(*) from table1 where not exists (select 'x'  from table2 where table1.CMPNT_ID=table2.CMPNT_ID ) and PROJ_ID >= 0;

  COUNT(*)
----------
         3

SQL> alter table table1 disable all triggers;

Table altered.

SQL> delete from table1 where not exists (select 'x'  from table2 where table1.CMPNT_ID=table2.CMPNT_ID )  and PROJ_ID >= 0;

0 rows deleted.

SQL> alter table table2 enable all triggers;

Table altered.

另外,在执行有些SQL的时候,会报ORA-00600 Oracle internal Error , argument [12700][xxxx][xx][][]的错误。可惜但是没有记录下来。
谁能帮帮我们啊。


只看该作者    顶部
离线 Laurence.li
玉玄宫


精华贴数 0
个人空间 0
技术积分 7029 (189)
社区积分 419 (1608)
注册日期 2004-8-19
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章
会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:帆船

发表于 2008-9-24 10:55 
select cmpnt_id from table1 where not exists (select 'x'  from table2 where table1.CMPNT_ID=table2.CMPNT_ID ) and PROJ_ID >= 0;
看看这3个记录的cmpnt id到底是什么东西


__________________
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久。死而不亡者寿。
只看该作者    顶部
离线 demonskull
初级会员



精华贴数 0
个人空间 0
技术积分 81 (19700)
社区积分 7 (13442)
注册日期 2006-3-30
论坛徽章:0
      
      

发表于 2008-9-24 11:06 
select cmpnt_id from table1 where not exists (select 'x'  from table2 where table1.CMPNT_ID=table2.CMPNT_ID ) and PROJ_ID >= 0;
可以出结果,如下
  CMPNT_ID
----------
    368128
    368158
    368183

但是如果执行select * from table1 where not exists (select 'x'  from table2 where table1.CMPNT_ID=table2.CMPNT_ID ) and PROJ_ID >= 0;就没有结果。。。


只看该作者    顶部
离线 Laurence.li
玉玄宫


精华贴数 0
个人空间 0
技术积分 7029 (189)
社区积分 419 (1608)
注册日期 2004-8-19
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章
会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:帆船

发表于 2008-9-24 11:22 
没道理啊
可能你的oracle有问题,建议把数据备份出来,然后重装一下


__________________
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久。死而不亡者寿。
只看该作者    顶部
离线 demonskull
初级会员



精华贴数 0
个人空间 0
技术积分 81 (19700)
社区积分 7 (13442)
注册日期 2006-3-30
论坛徽章:0
      
      

发表于 2008-9-24 11:25 
如果我执行
select * from table1 where cmpnt_id=368128;
返回的是‘no row selected'
用TOAD看,发现表里面无论table1还是table2里cmpnt_id 367217后面的数据丢失了。但是为什么select cmpnt_id from table1 where not exists (select 'x'  from table2 where table1.CMPNT_ID=table2.CMPNT_ID ) and PROJ_ID >= 0;可以出结果呢?
这些丢失的数据能找回来么?


只看该作者    顶部
在线/呼叫 zhangfengh
老狐狸


精华贴数 3
个人空间 0
技术积分 14590 (79)
社区积分 7160 (220)
注册日期 2002-10-12
论坛徽章:123
现任管理团队成员生肖徽章2007版:鸡生肖徽章2007版:鸡生肖徽章2007版:鸡生肖徽章2007版:鸡生肖徽章2007版:鸡
生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡

发表于 2008-9-24 11:35 
去掉no exists ,改写sql


__________________
=======================================
狐狸在这个世界上是凭借聪明而得到生存的,并且在这个世界上占有一席之地,学习狐狸的聪明,少走弯路。
=======================================
吸收别人的经验,使之成为自己的经验!
=======================================
只看该作者    顶部
离线 demonskull
初级会员



精华贴数 0
个人空间 0
技术积分 81 (19700)
社区积分 7 (13442)
注册日期 2006-3-30
论坛徽章:0
      
      

发表于 2008-9-24 11:52 
这个库是不完全恢复(按时间)过来的,恢复到了19号15:30分。
368128
368158
368183
都是这以前(before 19th 15:30)的数据,但是怎么会丢失呢?


只看该作者    顶部
离线 grwdpy
中级会员



精华贴数 0
个人空间 0
技术积分 1325 (1335)
社区积分 1 (38310)
注册日期 2005-4-6
论坛徽章:3
2008北京奥运纪念徽章:棒球2008北京奥运纪念徽章:跆拳道生肖徽章2007版:鸡   
      

发表于 2008-9-24 11:53 
老狐狸好多玫瑰了》。。


只看该作者    顶部
离线 Laurence.li
玉玄宫


精华贴数 0
个人空间 0
技术积分 7029 (189)
社区积分 419 (1608)
注册日期 2004-8-19
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章
会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:帆船

发表于 2008-9-24 11:56 
也许是索引出了问题,重建一下相关表的索引
索引里有,表里没有,就有可能出现这种情况,单独查cmpnd id光走了索引,查出记录了,而select *最终查的是表,就没有数据了,你的库是恢复的,有可能出现索引和表不一致的情况


__________________
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久。死而不亡者寿。
只看该作者    顶部
离线 Laurence.li
玉玄宫


精华贴数 0
个人空间 0
技术积分 7029 (189)
社区积分 419 (1608)
注册日期 2004-8-19
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章
会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:帆船

发表于 2008-9-24 12:00 
如果cmpnd id字段是not null的,你可以这样检查一下
select /*+ full(a) */ count(*) from table1 a;
select /*+ index_ffs(a <cmpnd_id索引名>) */ count(*) from table1 a;
查看第二天sql的执行计划,确保其只查了索引,没有访问表
然后看2个查询的结果,也许是不一样的。


__________________
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久。死而不亡者寿。
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问