试问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(+);
真糟糕,就在后面加一个(+);