• 认识oracle的update更新


    这两天给新同事安排了一个工作,即做一个update 的级联更新,在实际操作中发现了一个问题。就是对于Oracle的更新的语法,大部分人尤其是学过SqlServer的人在使用oracle的时候对于oracle的更新会有许多的疑问。就此记下,以便日后查阅

    update a set a.col1 = (select b.col1 from b where b.col2 = a.col2)
    where exists
    (select * from b where a.col2 = b.col2)

    /**oracle与sqlserver更新update的用法有不同,oracle是怎么处理的呢
    update a set a.col1=100 将所有行全部的特定列col1更新为特定值
    update a set a.col1=100 where a.col2<10 将满足col2条件的行的col1列的值更新为特定的值
    update a set a.col1=a.col1+a.col2 where a.col2<10 同一个表中的简单计算更新
    update a set a.col1=(select b.col1 from b where a.col2=b.col2)
    where exists(select * from b where a.col2=b.col2) 级联更新,将满足a.col2=b.col2的行的a.col1更新为对应的
    b.col1的值。当且仅当a=b时可以将where条件去掉。这个更新还可以这样理解:
    update a set a.col1=(select b.col1 from b where a.col2=b.col2)表示对于a中所有行满足a.col2=b.col2
    的进行更新,不满足条件的也更新,只不过找不到对应的值,只能将空值赋之,如果此时a.col1不允许为空那么会报插入空值错误。
    所以只有加上where条件,才能将a.col2<>b.col2的那些在a中的数据得以幸存(不被更新为空)。
    oracle的INSERT、UPDATE、MERGE

    ORACLE 2009-12-21 08:40:55 阅读68 评论0 字号:大中小 订阅
    /*用COURSE表为模板,创建一张新表COURSE_NEW,并且包括COURSE表的所有记录 */

    CREATE TABLE COURSE_NEW AS SELECT * FROM COURSE;

    /清空COURSE_NEW表中的所有记录/
    TRUNCATE TABLE COURSE_NEW;

    /*往COURSE_NEW表中增加以下记录:
    NO COURSE_NAME
    A001 ORACLE数据库管理
    A002 SQLSERVER安全指南
    A003 hibernate全攻略
    A004 .NET
    */
    INSERT INTO COURSE_NEW(NO,COURSE_NAME)
    SELECT 'A001','ORACLE数据库管理' FROM DUAL
    UNION
    SELECT 'A002','SQLSERVER安全指南' FROM DUAL
    UNION
    SELECT 'A003','Hibernate全攻略' FROM DUAL
    UNION
    SELECT 'A004','.NET' FROM DUAL;
    COMMIT;

    /根据COURSE表中的NO字段,用COURSE_NEW更新COURSE表/

    UPDATE (SELECT /*+ BYPASS_UJVC */ A.NO,A.COURSE_NAME,B.NO AS BNO,B.COURSE_NAME AS BNAME
    FROM COURSE A,COURSE_NEW B
    WHERE A.NO=B.NO)
    SET NO=BNO,COURSE_NAME=BNAME
    COMMIT;

    /分别使用INSERT/UPDATE和MERGE命令实现,用COURSE_NEW更新COURSE表中的记录,如果存在,则更新,不存在则INSERT/
    --用MERGE实现如下:

    INSERT INTO COURSE_NEW(NO,COURSE_NAME) --为了便于操作,先在COURSE_NEW中插入一条记录
    SELECT 'A005','HCNE网络工程师' FROM DUAL;
    COMMIT;
    MERGE INTO COURSE A
    USING COURSE_NEW B ON(A.NO=B.NO)
    WHEN MATCHED THEN
    UPDATE SET A.COURSE_NAME=B.COURSE_NAME
    WHEN NOT MATCHED THEN
    INSERT(A.NO,A.COURSE_NAME)
    VALUES(B.NO,B.COURSE_NAME);
    COMMIT;

    --用INSERT/UPDATE实现如下

    INSERT INTO COURSE_NEW(NO,COURSE_NAME)--为了便于操作,再在COURSE_NEW中插入一条记录
    SELECT 'A006','CCNA网络工程师' FROM DUAL;
    COMMIT;

    --利用UPDATE对于编号相同的字段进行更新
    UPDATE COURSE A SET(NO,COURSE_NAME)=
    (SELECT B.NO,B.COURSE_NAME
    FROM COURSE_NEW B
    WHERE A.NO=B.NO )
    WHERE EXISTS
    (SELECT 1 FROM COURSE_NEW B
    WHERE A.NO=B.NO);
    COMMIT;
    --利用INSERT对于原表中没有的进行添加
    INSERT INTO COURSE
    SELECT * FROM COURSE_NEW A
    WHERE NOT EXISTS(SELECT 1 FROM COURSE B WHERE A.NO=B.NO);
    COMMIT;

    /用一组语句代替对实现对全表的更新操作/
    --先用COURSE_TEST记录COURSE表的状态,以便在删除COURSE之后记录相关字段
    CREATE TABLE COURSE_TEST AS SELECT * FROM COURSE WHERE ROWNUM<1;
    INSERT /+ APPEND / INTO COURSE_TEST
    SELECT * FROM COURSE WHERE ROWNUM<5;
    COMMIT;
    --删除COURSE表
    TRUNCATE TABLE COURSE;
    --更新COURSE表
    INSERT /
    +APPEND
    / INTO COURSE
    SELECT A.NO,A.COURSE_NAME FROM COURSE_NEW A,COURSE_TEST B WHERE A.NO=B.NO;
    COMMIT;

  • 相关阅读:
    Request Validation in ASP.NET
    ANSI、Unicode、Unicode big endian、UTF8编码
    在win7下安装SQL sever2005
    配置SQL Server 2005 以允许远程连接
    传统网站与Web标准——DIV+CSS布局实例
    打造自己的reset.css
    传统网站与Web标准——表格布局实例
    每天工作4小时的程序员
    良好的XHTML规则
    列表导航栏实例(02)——精美电子商务网站赏析
  • 原文地址:https://www.cnblogs.com/clds/p/6016636.html
Copyright © 2020-2023  润新知