首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • oracle中UPDATE语句的问题 [已结贴,结贴人:jeremyliu821]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 14:41:06 楼主
    表结构如下:
    表 A 
    sell_no(key) order_no code1 code2
    U9900001 null    A001 B001         
    U9900002 null    null null
    U9900003 J9900001 null null
    U9900004 J9900002 null null
    U9900005 null    null null

    表 B
    sell_no(key)  cd1 cd2
    U9900001 A001 B001         
    U9900002 A002 B002
    U9900003 A003 B003
    U9900004 A004 B004
    U9900005 A005 B005

    表 C
    order_no(key) index(key) no1 no2
    J9900001 1        C001 D001         
    J9900002 1        C002 D002
    J9900002 2        C003 D003
    J9900003 1        C004 D004

    需要对表A的code1,code2字段都为null的数据进行更新
    条件:1.当A.order_no为null时,A.sell_no = B.sell_no,取表B的cd1与cd2的值
        2.当A.order_no有值时,A.order_no = C.order_no and C.index = '1'
          取表C的no1和no2值

    求一个oracle中update语句更新表A,得到如下结果:
    表 A 
    sell_no(key) order_no code1 code2
    U9900001 null    A001 B001         
    U9900002 null    A002 B002
    U9900003 J9900001 C001 D001
    U9900004 J9900002 C002 D002
    U9900005 null    A005 B005

    第一次发贴,如果有说明不足的地方再补充,谢谢大家
    50  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 14:58:071楼 得分:3
    create or replace procedure test
    is
    cursor c_cursor is
      select sell_no,order_no
        from A
        where code1 is null or code2 is null;
    begin
      for t_cursor in c_cursor loop
        if t_cursor.order_no is null then
            update A
              set code1 = (select cd1 from B where A.sell_no = B.sell_no),
                  code2 = (select cd2 from B where A.sell_no = B.sell_no)
              where sell_no = t_cursor.sell_no;
        else
            update A
              set code1 = (select no1 from C where A.order_no = C.order_no and C.index = '1'),
                  code2 = (select no2 from C where A.order_no = C.order_no and C.index = '1')
              where sell_no = t_cursor.sell_no;
        end if;
      end loop;
    end test; 
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 15:05:092楼 得分:5
    SQL code
    UPDATE a SET (code1, code2) = (SELECT DECODE (a.order_no, NULL, b.cd1, c.no1) code1, DECODE (a.order_no, NULL, b.cd2, c.no2) code1 FROM b, c WHERE a.sell_no = b.sell_no(+) AND a.order_no = c.order_no(+) AND c.index = '1') WHERE a.code1 IS NULL AND a.code2 IS NULL
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 15:34:083楼 得分:1
    引用 1 楼 Jane_64 的回复:
    create or replace procedure test
    is
    cursor c_cursor is
      select sell_no,order_no
        from A
        where code1 is null or code2 is null;
    begin
      for t_cursor in c_cursor loop
        if t_cursor.order_no is null then
            update A 
              set code1 = (select cd1 from B where A.sell_no = B.sell_no),
                  code2 = (select cd2 from B where A.sell_no = B.sell_no…
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 18:01:554楼 得分:0
    引用 2 楼 hebo2005 的回复:
    SQL codeUPDATE a
      SET (code1, code2) =
              (SELECT DECODE (a.order_no, NULL, b.cd1, c.no1) code1,
                      DECODE (a.order_no, NULL, b.cd2, c.no2) code1
                FROM b, c
                WHERE a.sell_no = b.sell_no(+) AND a.order_no = c.order_no(+)
                      AND c.index = '1')
    WHERE a.code1 IS NULL AND a.code2 IS NULL


    这个跟我之前写的一样,但会报错
    ORA-01705: 无法在关联列中指定外部连接
    我想是不是A.order_no非主键与C表连接的关系。。。忘高人指点

    谢谢1楼和3楼的,procedure是相对简单多了,做一个判断分别单表更新
    但在UPDATE语句里放一块就出错了,就像2楼提供的那样。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 18:21:255楼 得分:0
    SQL code
    update (select a.code1 old_code1, a.code2 old_code2, decode(a.order_no,null,b.cd1, c.no1) new_code1, decode(a.order_no,null,b.cd2, c.no2) new_code2 from b,c where a.sell_no = b.sell_no(+) and a.order_no = c.order_no(+) and c.index = '1' and a.code1 is null and a.code2 is null ) set old_code1 = new_code1, old_code2 = new_code2

    网上查了下,还有这种形式的。。。
    但也有错
    ORA-01779: cannot modify a column which maps to a non-key-preserved table
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-21 18:30:086楼 得分:4
    SQL code
    UPDATE a SET (code1, code2) = (SELECT DECODE (a.order_no, NULL, b.cd1, c.no1) code1, DECODE (a.order_no, NULL, b.cd2, c.no2) code1 FROM a,b, c WHERE a.sell_no = b.sell_no(+) AND a.order_no = c.order_no(+) AND c.index = '1' and a.code1 IS NULL AND a.code2 IS NULL ) WHERE a.code1 IS NULL AND a.code2 IS NULL

    这样去试试
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • fosjos
    • 等级:
    发表于:2008-05-21 21:04:397楼 得分:1
    分成两句update会报错吗
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 13:30:308楼 得分:0
    引用 6 楼 hebo2005 的回复:
    SQL code
    UPDATE a
      SET (code1, code2) =
              (SELECT DECODE (a.order_no, NULL, b.cd1, c.no1) code1,
                      DECODE (a.order_no, NULL, b.cd2, c.no2) code1
                FROM a,b, c
                WHERE a.sell_no = b.sell_no(+) AND a.order_no = c.order_no(+)
                      AND c.index = '1'
                      and a.code1 IS NULL AND a.code2 IS NULL )
    WHERE a.code1 I…


    ora-01427:single-row subquery returns more than one row
    单行子查询返回多
    原因还是一样
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 13:32:269楼 得分:0
    引用 7 楼 fosjos 的回复:
    分成两句update会报错吗


    分开更新当然不会报错
    要用procedu
    但我是想用update语句来实现
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-22 16:49:0510楼 得分:1
    引用 2 楼 hebo2005 的回复:
    SQL codeUPDATE a
      SET (code1, code2) =
              (SELECT DECODE (a.order_no, NULL, b.cd1, c.no1) code1,
                      DECODE (a.order_no, NULL, b.cd2, c.no2) code1
                FROM b, c
                WHERE a.sell_no = b.sell_no(+) AND a.order_no = c.order_no(+)
                      AND c.index = '1')
    WHERE a.code1 IS NULL AND a.code2 IS NULL
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-26 17:34:2411楼 得分:0
    引用 10 楼 dajun539 的回复:
    引用 2 楼 hebo2005 的回复:
    SQL codeUPDATE a
      SET (code1, code2) =
              (SELECT DECODE (a.order_no, NULL, b.cd1, c.no1) code1,
                      DECODE (a.order_no, NULL, b.cd2, c.no2) code1
                FROM b, c
                WHERE a.sell_no = b.sell_no(+) AND a.order_no = c.order_no(+)
                      AND c.index = '1')
    WHERE a.code1 IS NULL AND a.code2 IS NULL


    楼上看贴不仔细啊。。。都没看我4楼的回帖
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-26 17:35:4812楼 得分:0
    看来没人能帮忙解决啦。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-26 17:57:0413楼 得分:0
    引用 12 楼 jeremyliu821 的回复:
    看来没人能帮忙解决啦。。。

    我在6楼改过了啊
    你去试试看看行不行
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-26 20:10:4214楼 得分:35
    update a set (code1,code2)=(select code1,code2 from(

    select a.sell_no nos,b.cd1 code1,b.cd2 code2 from a,b where a.order_no is null and a.sell_no=b.sell_no
    union
    select a.sell_no nos,c.no1 code1,c.no2 code2 from a,c where a.order_no is not null and a.order_no=c.order_no and c.indexs=1) d
    where a.sell_no=d.nos
    )
    ;
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-26 20:12:0815楼 得分:0
    这个一定行,我测试过了,其中只是把你的index字段改为indexs并为integer型,不过不影响
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-27 08:59:0116楼 得分:0
    引用 13 楼 hebo2005 的回复:
    引用 12 楼 jeremyliu821 的回复:
    看来没人能帮忙解决啦。。。

    我在6楼改过了啊
    你去试试看看行不行


    试过啦,在8楼回复你了。。。
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-27 09:51:4717楼 得分:0
    引用 14 楼 chenyifei211 的回复:
    update a set (code1,code2)=(select code1,code2 from(

    select a.sell_no nos,b.cd1 code1,b.cd2 code2 from a,b where a.order_no is null and a.sell_no=b.sell_no
    union
    select a.sell_no nos,c.no1 code1,c.no2 code2 from a,c where a.order_no is not null and a.order_no=c.order_no and c.indexs=1) d
    where a.sell_no=d.nos
    )
    ;


    测试了下,的确能正常执行
    但少了个条件,在最后加上a.code1 is null and a.code2 is null 就行
    SQL code
    UPDATE A SET ( CODE1 , CODE2 ) = ( SELECT CODE1 , CODE2 FROM ( SELECT A.SELL_NO NOS , B.CD1 CODE1 , B.CD2 CODE2 FROM A , B WHERE A.ORDER_NO IS NULL AND A.SELL_NO=B.SELL_NO UNION SELECT A.SELL_NO NOS , C.NO1 CODE1 , C.NO2 CODE2 FROM A , C WHERE A.ORDER_NO IS NOT NULL AND A.ORDER_NO=C.ORDER_NO AND C.INDEXS=1 ) D WHERE A.SELL_NO=D.NOS ) WHERE A.CODE1 IS NULL AND A.CODE2 IS NULL


    PS:上面表的字段名都是假设的,但没注意到用了index关键字。。。谢谢提醒
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-27 10:33:5518楼 得分:0
    学习!!!
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    世纪乐知(北京)网络技术有限公司 版权所有 京 ICP 证 020026 号
    Copyright © 2000-2007, CSDN.NET, All Rights Reserved