如何根据SQL ORACLE 10G中的子项数增加员工的工资?

时间:2016-07-30 16:42:32

标签: sql oracle sql-update oracle10g

我有两个表:员工和受抚养人

结构
- 表员工

Name        Null?       Type
EMPLOYEEID  NOT NULL    NUMBER(3)
LNAME       NOT NULL    VARCHAR2(15)
FNAME       NOT NULL    VARCHAR2(15)
POSITIONID              NUMBER(1)
SUPERVISOR              NUMBER(3)
HIREDATE                DATE
SALARY                  NUMBER(6)
COMMISSION              NUMBER(5)
DEPTID                  NUMBER(2)
QUALID                  NUMBER(1)


- 表格相关

Name        Null?       Type
EMPLOYEEID  NOT NULL    NUMBER(3)
DEPENDENTID NOT NULL    NUMBER(1)
DEPDOB      NOT NULL    DATE
RELATION    NOT NULL    VARCHAR2(8)


数据
- 表员工

EMPLOYEEID  LNAME   FNAME   POSITIONID  SUPERVISOR  HIREDATE    SALARY  COMMISSION  DEPTID  QUALID
111         Smith   John    1                       15/04/60    265000  35000       10      1
246         Houston Larry   2           111         19/05/67    150000  10000       40      2
123         Roberts Sandi   2           111         02/12/91    75000               10      2
543         Dev     Derek   2           111         15/03/95    80000   20000       20      1
433         McCall  Alex    3           543         10/05/97    66500               20      4
135         Garner  Stanley 2           111         29/02/96    45000   5000        30      5
200         Shaw    Jinku   5           135         03/01/00    24500   3000        30
222         Chen    Sunny   4           123         15/08/99    35000               10      3


- 表格相关

EMPLOYEEID  DEPENDENTID DEPDOB  RELATION
543            1        28/09/58    Spouse
543            2        14/10/88    Son
200            1        10/06/76    Spouse
222            1        04/02/75    Spouse
222            2        23/08/97    Son
222            3        10/07/99    Daughter
111            1        12/12/45    Spouse


我有两名员工:一名员工有一个孩子,另一名员工有两个孩子。我通过以下查询得到它:
查询

SELECT employee.employeid, lname, fname, salary, dependent.relation 
FROM employee INNER JOIN dependent
ON employee.employeeid = dependent.employeeid
WHERE dependent.relation = 'Daughter' OR dependent.relation = 'Son';

结果

EMPLOYEEID  LNAME   FNAME   SALARY  RELATION
543         Dev     Derek   80000   Son
222         Chen    Sunny   35000   Son
222         Chen    Sunny   35000   Daughter

我的作业是增加每个孩子100美元的工资,我尝试使用以下代码:

UPDATE employee
SET SALARY = salary + 100
WHERE employee.employeeid IN (
SELECT employee.EMPLOYEEID FROM employee INNER JOIN dependent
ON employee.employeeid = dependent.employeeid
WHERE dependent.relation = 'Daughter' OR dependent.relation = 'Son' );

但是,我没有得到期望的结果。员工“陈”有两个孩子,但他的工资只增加一次,没有两次。她的最终薪水是35100美元,没有35200美元。

有人能帮助我吗?

1 个答案:

答案 0 :(得分:0)

我无法在Oracle版本10上进行测试,但这应该可以正常工作: 好吧,显然,它在Oracle 10中不起作用(尽管它在Oracle 12中可以正常工作)。我使用merge在帖子底部添加了一个可以正常工作的替代方法。

update (
  select e.salary,
         d.childcnt * 100 as increase
    from employee e
    join (select d.employeeid, count(*) as childcnt
            from dependent d
           where d.relation in ('Son', 'Daughter')
           group by d.employeeid) d
      on d.employeeid = e.employeeid
) set salary = salary + increase

这是使用merge命令实现相同功能的另一种方法。这应该在Oracle 10中正常工作:

merge into employee dest
using (
  select employeeid, 
         count(*) * 100 as increase
    from dependent d
   where relation in ('Son', 'Daughter')
   group by employeeid
) src
on (src.employeeid = dest.employeeid)
when matched then 
  update set dest.salary = dest.salary + src.increase