博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle 基于其他表中的数据更新记录时空值的处理方法
阅读量:2496 次
发布时间:2019-05-11

本文共 5129 字,大约阅读时间需要 17 分钟。

--创建测试数据
--将 employee_id 为 100 的 department_id 更新为空
SQL> create table employees as select * from hr.employees;
SQL> update employees set department_id=NULL where employee_id=100;
SQL> select * from employees;
EMPLOYEE_ID FIRST_NAM LAST_NAME EMAIL     PHONE_NUMBER              HIRE_DATE            JOB_ID     SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- --------- --------- --------- ------------------------- -------------------- ---------- ------ -------------- ---------- -------------
       
100 Steven    King      SKING     515.123.4567              2003-06-17 00:00:00  AD_PRES     24000
        101 Neena     Kochhar   NKOCHHAR  515.123.4568              2005-09-21 00:00:00  AD_VP       17000               100            90
        102 Lex       De Haan   LDEHAAN   515.123.4569              2001-01-13 00:00:00  AD_VP       17000               100            90
        103 Alexander Hunold    AHUNOLD   590.423.4567              2006-01-03 00:00:00  IT_PROG      9000               102            60
        104 Bruce     Ernst     BERNST    590.423.4568              2007-05-21 00:00:00  IT_PROG      6000               103            60
        105 David     Austin    DAUSTIN   590.423.4569              2005-06-25 00:00:00  IT_PROG      4800               103            60
        106 Valli     Pataballa VPATABAL  590.423.4560              2006-02-05 00:00:00  IT_PROG      4800               103            60
        107 Diana     Lorentz   DLORENTZ  590.423.5567              2007-02-07 00:00:00  IT_PROG      4200               103            60
        108 Nancy     Greenberg NGREENBE  515.124.4569              2002-08-17 00:00:00  FI_MGR      12008               101           100
        109 Daniel    Faviet    DFAVIET   515.124.4169              2002-08-16 00:00:00  FI_ACCOUNT   9000               108           100
        110 John      Chen      JCHEN     515.124.4269              2005-09-28 00:00:00  FI_ACCOUNT   8200               108           100
--需求是:把所有员工的薪水修改成高于所属部门平均薪水的 10%
--如果不对空值进行处理,直接更新的话,则 department_id 为空值的薪水会被
更新成空值。因为在这种场景下,一个值为 NULL 的部门无法与另一个值为 NULL 的部门匹配,
所以关联子查询会返回 NULL 。
SQL> update employees e
  2     set salary =
  3         (select avg(salary) * 1.10
  4            from employees se
  5           where se.department_id = e.department_id);
已更新107行。
SQL> select * from employees;
EMPLOYEE_ID FIRST_NAM LAST_NAME EMAIL     PHONE_NUMBER              HIRE_DATE            JOB_ID     SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- --------- --------- --------- ------------------------- -------------------- ---------- ------ -------------- ---------- -------------
       
100 Steven    King      SKING     515.123.4567              2003-06-17 00:00:00  AD_PRES
        101 Neena     Kochhar   NKOCHHAR  515.123.4568              2005-09-21 00:00:00  AD_VP       18700               100            90
        102 Lex       De Haan   LDEHAAN   515.123.4569              2001-01-13 00:00:00  AD_VP       18700               100            90
        103 Alexander Hunold    AHUNOLD   590.423.4567              2006-01-03 00:00:00  IT_PROG      6336               102            60
        104 Bruce     Ernst     BERNST    590.423.4568              2007-05-21 00:00:00  IT_PROG      6336               103            60
        105 David     Austin    DAUSTIN   590.423.4569              2005-06-25 00:00:00  IT_PROG      6336               103            60
        106 Valli     Pataballa VPATABAL  590.423.4560              2006-02-05 00:00:00  IT_PROG      6336               103            60
        107 Diana     Lorentz   DLORENTZ  590.423.5567              2007-02-07 00:00:00  IT_PROG      6336               103            60
        108 Nancy     Greenberg NGREENBE  515.124.4569              2002-08-17 00:00:00  FI_MGR       9461               101           100
解决方法:
1、在 WHERE 字句中添加一个非空条件
SQL> update employees e
  2     set salary =
  3         (select avg(salary) * 1.10
  4            from employees se
  5           where se.department_id = e.department_id)
  6          
where department_id is not null;
已更新105行。
SQL> select * from employees;
EMPLOYEE_ID FIRST_NAM LAST_NAME EMAIL     PHONE_NUMBER              HIRE_DATE            JOB_ID     SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- --------- --------- --------- ------------------------- -------------------- ---------- ------ -------------- ---------- -------------
        100 Steven    King      SKING     515.123.4567              2003-06-17 00:00:00  AD_PRES     24000
        101 Neena     Kochhar   NKOCHHAR  515.123.4568              2005-09-21 00:00:00  AD_VP       18700               100            90
        102 Lex       De Haan   LDEHAAN   515.123.4569              2001-01-13 00:00:00  AD_VP       18700               100            90
        103 Alexander Hunold    AHUNOLD   590.423.4567              2006-01-03 00:00:00  IT_PROG      6336               102            60
        104 Bruce     Ernst     BERNST    590.423.4568              2007-05-21 00:00:00  IT_PROG      6336               103            60
        105 David     Austin    DAUSTIN   590.423.4569              2005-06-25 00:00:00  IT_PROG      6336               103            60
        106 Valli     Pataballa VPATABAL  590.423.4560              2006-02-05 00:00:00  IT_PROG      6336               103            60
        107 Diana     Lorentz   DLORENTZ  590.423.5567              2007-02-07 00:00:00  IT_PROG      6336               103            60
        108 Nancy     Greenberg NGREENBE  515.124.4569              2002-08-17 00:00:00  FI_MGR       9461               101           100
2、使用 NVL 函数来处理 NULL 值
SQL> update employees e
  2     set salary =
  3        
nvl((select avg(salary) * 1.10
  4            from employees se
  5           where se.department_id = e.department_id),salary);
已更新107行。
SQL> select * from employees;
EMPLOYEE_ID FIRST_NAM LAST_NAME EMAIL     PHONE_NUMBER              HIRE_DATE            JOB_ID     SALARY COMMISSION_PCT MANAGER_ID DEPARTMENT_ID
----------- --------- --------- --------- ------------------------- -------------------- ---------- ------ -------------- ---------- -------------
        100 Steven    King      SKING     515.123.4567              2003-06-17 00:00:00  AD_PRES     24000
        101 Neena     Kochhar   NKOCHHAR  515.123.4568              2005-09-21 00:00:00  AD_VP       18700               100            90
        102 Lex       De Haan   LDEHAAN   515.123.4569              2001-01-13 00:00:00  AD_VP       18700               100            90
        103 Alexander Hunold    AHUNOLD   590.423.4567              2006-01-03 00:00:00  IT_PROG      6336               102            60
        104 Bruce     Ernst     BERNST    590.423.4568              2007-05-21 00:00:00  IT_PROG      6336               103            60
        105 David     Austin    DAUSTIN   590.423.4569              2005-06-25 00:00:00  IT_PROG      6336               103            60
        106 Valli     Pataballa VPATABAL  590.423.4560              2006-02-05 00:00:00  IT_PROG      6336               103            60
        107 Diana     Lorentz   DLORENTZ  590.423.5567              2007-02-07 00:00:00  IT_PROG      6336               103            60
        108 Nancy     Greenberg NGREENBE  515.124.4569              2002-08-17 00:00:00  FI_MGR       9461               101           100

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26506993/viewspace-2015795/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26506993/viewspace-2015795/

你可能感兴趣的文章
CentOS软件的安装,更新与卸载命令
查看>>
算法提高 扶老奶奶过街【真假话逻辑判断】
查看>>
php学习笔记
查看>>
机器学习——朴素贝叶斯分类器
查看>>
JavaScript 表单验证 方法
查看>>
Java for LeetCode 139 Word Break
查看>>
[原]F5负载均衡示例:轮寻
查看>>
技术人生:如何成为一位优秀的程序员
查看>>
自己看
查看>>
算法导论——求最大子数组问题
查看>>
iOS开发:正则表达式
查看>>
正则表达式
查看>>
JavaScript高级程序设计之函数
查看>>
深入理解C语言-二级指针三种内存模型
查看>>
Java之旅--Web.xml解析
查看>>
一口一口吃掉Hibernate(六)——多对多关联映射
查看>>
07 JAVA语言基础关键字的概述和使用
查看>>
storm.yaml 配置项
查看>>
Memcache第一篇---基础教程
查看>>
常用API
查看>>