CSDN博客

img hahu

ORACLE 8.1.5和8.1.6的问题[2004年3月20日 23:46]

发表于2004/7/11 2:24:00  1017人阅读

试问ORACLE8.1.6出来有多久了,今年年初九才开始使用ORACLE,没想到这么快就遇到了版本的问题。

下面先在ORACLE8。1。6里面操作

表A:定义一些ID和对应的值

ID           Value

1              刘国强

2               她

表B:记录数据,内有一个AID是和上面ID对应的,但是不是外键,它的值可能在A中没有定义

ID         。。。    AID

1          。。。     1

2           。。。    5

上面出现的5在A表中是没有定义的

现在要从B表中Select 出所有纪录,并且添加一个字段,是表示AID在A表中对应的Value

原来的代码是

select b.ID,a.ID,a.Value from B b,A a where b.AID=a.ID;

如果用上面的这一句,可以发现,如果在B表中插入一条AID在A表中没有定义的值,结果将不被选出来。有什么办法呢?ORACLE的工具教程实在太缺乏,我竟然无法在程序目录下找到,什么地方有呢?只好在SQL Server的联机帮助里面找,很容易就找到了,MS的东西就是好。(希望没有一大堆砖头砸过来),修改后的SQL语句如下

select b.ID,b.AID,(case when (select count(ID) from A where ID=b.AID)>0 then a.Value else '未定义该ID' end) from B b,A a where b.AID=(case when (select count(ID) from A where ID=b.AID)>0 then a.ID else b.AID end) ;

试一下,发现已经可以选出A中未定义的B.AID了,可是会出现重复纪录,这容易解决。

select distinct b.ID,b.AID,(case when (select count(ID) from A where ID=b.AID)>0 then a.Value else '未定义该ID' end) from B b,A a where b.AID=(case when (select count(ID) from A where ID=b.AID)>0 then a.ID else b.AID end) ;

一个distinct就解决了。

真是失败,今天在一台ORACLE版本是8.1.5的机器上用,竟然出错了,提示:缺少右括号

怎么会呢,难道真的缺少了。

忙到编译程序的那台机上查看,真糟糕,可能是8.1.5不支持case语句,或者是这个版本的case不是这样的,我想应该是前一个。刚使用ORACLE就遇上版本问题。这可怎么解决呢?

头儿说要我重新做,可是谁叫我编译的那台机器是用8.1.6的,别人测试的机器也是8.1.6呢?况且,用到这种结构的也不只有这里,这样的返工我是没有找到其他可以用sql语句解决的方法,ORACLE中动态创建记录集的存储过程还没学会,可平白多了多少时间。在SQL server里面好像可以用Left Join,Right Join这些语句,可是在ORACLE中,甚至8.1.6都不能使用(或许我的使用方法不对,^_^)。下个星期是测试的最后一个星期,该怎么办呢?

。。。。。。。。。

正写这上面这些文字,没想到竟然被我想到通路了,前几天试过在ORACLE中(当然是8.1.6),可以用UNION来连接两个SELECT 语句。马上试试在8.1.5中行不行,哈哈,老天保佑,真的可以,马上结果就出来了。A中有定义的加上没有定义的,不就出来了所有的了吗?顶多加上一重排序。我真是天才(唉呦,谁用石头砸我,血。。。轰,我巨大的身躯倒了下来,扬起一片尘埃)

select b.ID,a.ID AID,a.Value from B b,A a where b.AID=a.ID UNION select b.ID,b.AID,'未定义该名称' Value from B b,A a where b.AID<>a.ID;

上面应该是没有排序的一种,排序后改成

select ID,AID,Value from (select b.ID,a.ID AID,a.Value from B b,A a where b.AID=a.ID UNION select b.ID,b.AID,'未定义该名称' Value from B b,A a where b.AID<>a.ID) order by ID;

这样不就成了,或许可以说,这种解决方法比上面用case的方法还好很多。上面case的方法,就和我们用for循环的时候不断用if判断条件一样,性能自然不能好到哪里去,真是因祸得福阿!

明天可以安心去长城了,哈哈

2004年7月11日注:

这其实就是数据库中的外连接问题,难道Oracle中就没有考虑外连接的问题吗?当然不可能。后来还是找到了解决办法,还比较奇特

select b.ID,a.ID,a.Value from B b,A a where b.AID=a.ID(+);

真糟糕,就在后面加一个(+);

0 0

相关博文

我的热门文章

img
取 消
img