ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于oracle 10g的一个bug

关于oracle 10g的一个bug

原创 Linux操作系统 作者:skywater007 时间:2009-02-26 10:34:06 0 删除 编辑

oracle版本 10.2.0.1.0
        我建了3张表:
create table yjjtest01
(a1 char(2),                         
b1 char(2),
c1 number(5,2)
);
insert into yjjtest01
values('0','a','3');
insert into yjjtest01
values('0','b','5');
insert into yjjtest01
values('1','c','11');
insert into yjjtest01
values('1','d','3');
insert into yjjtest01
values('1','b','5');
insert into yjjtest01
values('2','c','7');
insert into yjjtest01
values('2','d','10');
insert into yjjtest01
values('2','e','5');
-----------
create table yjjtest02
(a2 char(2),
b2 char(2)
);
insert into yjjtest02
values('a','tr');
insert into yjjtest02
values('b','tr');
insert into yjjtest02
values('c','tr');
insert into yjjtest02
values('d','fa');
insert into yjjtest02
values('e','tr');
-------------------
create table yjjtest03
(a3 char(2),
b3 number(5,2)
);
insert into yjjtest03
values('0','8');
insert into yjjtest03
values('1','16');
insert into yjjtest03
values('2','10');
    写了两个我认为表达了相同意思的sql:
--下面这两个应该表达一样意思的啊
--*******sql_test1:
select *
from
(
select a.a1,sum(case when b.b2='tr' then c1 else 0 end) amount
from yjjtest01 a,yjjtest02 b
where a.b1=b.a2
group by a1
) tmp
where not exists
(select 1 from yjjtest03 c where tmp.a1=c.a3 and tmp.amount=c.b3)
查询结果:空
--********sql_test2:
select *
from
(
select a.a1,sum(case when b.b2='tr' then c1 else 0 end) amount
from yjjtest01 a,yjjtest02 b
where a.b1=b.a2
group by a1
) tmp
where  exists
(select  1 from yjjtest03 c where tmp.a1=c.a3 and tmp.amount!=c.b3)
查询结果:
A1 AMOUNT
2    12
--*******我修改了下sql_test1,结果对了
select *
from
(
select a.a1,sum(case when b.b2='tr' then c1 else 0 end) amount
from yjjtest01 a,yjjtest02 b
where a.b1=b.a2
group by a1
) tmp
where not exists
(select 1 from yjjtest03 c where trim(tmp.a1)=trim(c.a3) and tmp.amount=c.b3)
--我觉得没必要加trim的

实际上这是oracle10.2.0.1的bug,在其它版本就不存在这个问题:
使用下面的方法添加提示,不认view合并就可以了。

SQL code
SELECT /*+no_merge(TMP)*/* FROM (SELECT A.A1, SUM(CASE WHEN B.B2 = 'tr' THEN C1 ELSE 0 END) AMOUNT FROM YJJTEST01 A, YJJTEST02 B WHERE A.B1 = B.A2 GROUP BY A1) TMP WHERE NOT EXISTS (SELECT 1 FROM YJJTEST03 C WHERE TMP.A1 = C.A3 AND TMP.AMOUNT = C.B3);

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8251015/viewspace-557887/,如需转载,请注明出处,否则将追究法律责任。

上一篇: 水哥的开篇之作
下一篇: ASM 的一个bug
请登录后发表评论 登录
全部评论

注册时间:2008-04-07

  • 博文量
    7
  • 访问量
    13587