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

原创 2004年07月11日 02:24:00

试问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(+);

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

2004年2月28日,星期六(2)

    我感叹中国人之多,中国贫富差距之大,中国不平等之广泛。    唉,不感叹了,我上火车后,我知道我没有座位,然后朝火车的尾部走去,按照惯例,火车尾部总有一节车厢是机动的。呵呵,我的判断是正确的。...
  • sun_DouDou
  • sun_DouDou
  • 2006年08月09日 17:21
  • 880

2004雅典奥运会开幕

终于等到开幕式了,不知道有多少个国家的代表队入场了,中国队还是没有出现等待着那一刻,China!红色的队伍,竟然是西班牙,以前中国队也穿过红西装的,很鲜艳,也很漂亮中国队这次好像是要穿黑色的西装吧。继...
  • lastking
  • lastking
  • 2004年08月14日 03:18
  • 877

巴萨 2:1 切尔西

    凌晨3点45,欧洲两大豪门的对决,斯坦福侨世纪大战名副其实,真不枉费我熬夜看球加赔上一个上午的精神。比赛过程的精彩程度就不用多说啦,虽然前两个进球都是乌龙球,但是埃托奥的进球给比赛划上完美句号...
  • neohuo
  • neohuo
  • 2006年02月23日 13:40
  • 705

2018年2月3日训练日记

要理解思想而不是代码!!! 昨天晚上的比赛。重新读了B题。然后发现当时读错题意了(1、乘积号看成和号2、输出n行,以为是一行)。今天读完了之后突然发现好水。立马敲了一遍kmp搞过了。注意的是每个...
  • LSD20164388
  • LSD20164388
  • 2018年02月03日 21:01
  • 90

Oracle10g 日期格式转换(XXXX年XX月XX日)

将日期格式转换成:XXXX年XX月XX日 SQL语句如下: select to_char(sysdate,'yyyy"年"mm"月"dd"日"') as s_date from dual...
  • john320
  • john320
  • 2013年09月03日 14:19
  • 2035

Oracle格式化日期:yyyy年mm月dd日

Oracle格式化日期:yyyy年mm月dd日
  • songyanfei1205
  • songyanfei1205
  • 2017年03月28日 13:45
  • 3878

2009年3月30日

冒泡排序法 2007年08月01日 星期三 17:36 冒泡排序法又名起泡法。 冒泡排序法原理详解(一): 起泡法是从一端开始比较的,第一次循环就是把最小数上升到第一位...
  • xhyz07
  • xhyz07
  • 2012年12月08日 21:48
  • 175

2010年4月20日星期二

  • linstein
  • linstein
  • 2010年04月21日 20:18
  • 102

2016-12-23大学四年后两年

昨天看了林锐的大学十年后,挫败或许就是我现在的状态吧。 所以决定从新背起行囊写代码,测试的日子过的太堕落了,在此也劝所有不喜欢测试的同志们赶紧学点技能换工作吧,别浪费青春了。 现在有两个方向可以选...
  • L_tatrium
  • L_tatrium
  • 2016年12月23日 09:53
  • 121

[BZOJ 4380] POI 2015 Myjnie

网上搜不到题解…搞了两天才勉强跑过去…太弱…做法应该就是区间dp吧, 把所有询问的 c 值排序, 由大到小枚举每一个 c ,令 f[i][j]表示当前的区间 [i, j] 中能取到的最大值, 然后用一...
  • visit_world
  • visit_world
  • 2016年03月03日 13:15
  • 970
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ORACLE 8.1.5和8.1.6的问题[2004年3月20日 23:46]
举报原因:
原因补充:

(最多只允许输入30个字)