zoukankan      html  css  js  c++  java
  • [转]Oracle用一个表的列更新另一个表对应记录的列

    Oracle用一个表的列更新另一个表对应记录的列

    http://hi.baidu.com/bdbk/blog/item/ae22f0d392948fd6a8ec9ada.html

    这几天搞一个小程序,需要将一个表中几个列的内如批量复制到另一个表相应字段中。执行下面语句: 

    update ZWSZ Z set Z.WJLB = 
    (select G.WJLB from RMWJGS G WHERE G.DWCODE=Z.DWDM AND G.ZWCODE=Z.ZWMC )

      可总是不成功,看了看提示:“单行子查询返回多于一个行”。原来是两个表的记录并不是一对一的关系,一个表中的记录数大于另一个表,即不关联的记录,所以才会失败

      按照提示,查询条件中加上“ rownum < 2 ”,成功

    ——————————————————————————————————————————

    随便贴一张网友的妙文:

      今天有这样一个需求:因为要加快查询速度,避免表的联合查询的效率问题,所以要把一个表的几个字段填到另一个表的几个字段上去。 
    一开始做法如下: 
    update tbl1 a, tbl2 b    set a.col1=b.col1,a.col2=b.col2   where a.key=b.key
       
      这个语句在 MySQL 上是可以运行的,但在 ORACLE 上无法执行。在网上查了一个发现可以这样: 
    update tbl1 a
        set a.col1=(select b.col1 from tbl2 b where a.key=b.key),
            a.col2=(select b.col2 from tbl2 b where a.key=b.key)
      但我感觉这样的效率好像比较低,写得SQL又很长,更新一行数据要写两个嵌套,直观上感觉 "select xxx from tbl2 b where a.key=b.key" 语句好像被执行了两遍(实际我没有测试验证)。于是接着在网上搜,查到一个比较好看的写法,如下:

    update tbl1 a
       set (a.col1, a.col2) = (select b.col1, b.col2
                                  from tbl2 b
                                  where a.key = b.key)

    这种写法感觉还比较满意。但注意了,经过测试,这种语法在 MySQL 中是不合法的。

    今天继续使用最后这个SQL的时候,也发现了一些缺点:如果 tbl1.key 的值在 tbl2.key 中没有此值是,这个更新的两个字段 tbl1.col1 和 tbl1.col2 字段会被更新为空值(null)。这个结果是我不想看到的。也是没办法解决的。如果想解决的话,也可以在最后加入一个条件,如下表中加大字体的部分:

    update tbl1 a
       set (a.col1, a.col2) = (select b.col1, b.col2
                                  from tbl2 b
                                  where a.key = b.key)
       where a.key in(select key from tbl2)

    但这种做法肯定会导致性能严重下降。所以,我写一个更复杂的方法来解决这个问题,现在没时间。。。

  • 相关阅读:
    start tag, end tag issues in IE7, particularly in xslt transformation
    用SandCastle为注释生成chm文档
    Firebug
    架构的重点
    Linux Shell常用技巧(十) 管道组合
    Linux JDK升级
    Linux Shell常用技巧(十二) Shell编程
    Packet Tracer 5.0实验(一) 交换机的基本配置与管理
    Linux Shell常用技巧(六) sort uniq tar split
    Linux Shell常用技巧(二) grep
  • 原文地址:https://www.cnblogs.com/flyingfish/p/1715751.html
Copyright © 2011-2022 走看看