/*
SELECT eb.emp_no, first_name, last_name, btype, salary, salary*0.1 as bonus
FROM employees as e, salaries as s, emp_bonus as eb
WHERE EXISTS(select emp_no from emp_bonus as eb
             where btype=1)
and e.emp_no=eb.emp_no
and s.emp_no = eb.emp_no
and e.emp_no=s.emp_no
and to_date='9999-01-01'
UNION
SELECT eb.emp_no, first_name, last_name, btype, salary, salary*0.2 as bonus
FROM employees as e, salaries as s, emp_bonus as eb
WHERE EXISTS(select emp_no from emp_bonus as eb
             where btype=2)
and e.emp_no=eb.emp_no
and s.emp_no = eb.emp_no
and e.emp_no=s.emp_no
and to_date='9999-01-01'
UNION
SELECT e.emp_no, first_name, last_name, btype, salary, salary*0.3 as bonus
FROM employees as e, salaries as s, emp_bonus as eb
WHERE EXISTS(select emp_no from emp_bonus as eb
            WHERE btype not in (1,2))
and e.emp_no=eb.emp_no
and s.emp_no = eb.emp_no
and e.emp_no=s.emp_no
and to_date='9999-01-01';
*/

select e.emp_no,
    e.first_name,
    e.last_name,
    eb.btype,
    s.salary,
    (
        case when eb.btype=1  then s.salary*0.1
           when eb.btype=2 then s.salary*0.2
           else s.salary*0.3
        end
     ) as bonus 
from employees e join emp_bonus eb on e.emp_no=eb.emp_no
     join salaries s on eb.emp_no=s.emp_no
where s.to_date="9999-01-01"

这道题的难点,还是在于自己不会这个函数,不知道自己不知道。于是想要用一种比较麻烦的方法来解决,最后还是不得不求助于他人。

上面省略的题目是错误的,原因在于UNION链接的双方必须具有完全一致的名称、表达式和聚合函数。