首页 > 试题广场 >

将所有获取奖金的员工当前的薪水增加10%

[编程题]将所有获取奖金的员工当前的薪水增加10%
  • 热度指数:114997 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
现有员工获取到的奖金简表emp_bonus如下:
  • emp_no指获取到奖金的员工编号;
  • bytpe指获取到的奖金类型。
emp_no btype
10001 1

有员工薪资简表salaries如下:
  • emp_no指员工编号;
  • salary指薪资;
  • from_date指该薪资的开始日期;
  • to_date指该薪资的结束日期。
emp_no
salary from_date to_date
10001
10001
85097.0
88958.0
2001-06-22
2002-06-22
2002-06-22
9999-01-01

请你写出更新语句,将所有获取奖金的员工当前的(salaries.to_date='9999-01-01')薪水增加10%。(emp_bonus里面的emp_no都是当前获奖的所有员工,不考虑获取的奖金的类型)。
以上示例更新后的结果salaries为:
emp_no
salary from_date to_date
10001
10001
85097.0
97853.8
2001-06-22
2002-06-22
2002-06-22
9999-01-01
注:只需写出更新语句,后台会执行以下SQL语句,将更新后的结果与预期结果对比:
select * from salaries;

示例1

输入

drop table if exists  emp_bonus; 
drop table if exists  `salaries` ; 
create table emp_bonus(
emp_no int not null,
btype smallint not null);
CREATE TABLE `salaries` (
`emp_no` int(11) NOT NULL,
`salary`  float(11,1) default NULL,
`from_date` date NOT NULL,
`to_date` date NOT NULL,
PRIMARY KEY (`emp_no`,`from_date`));
insert into emp_bonus values(10001,1);
INSERT INTO salaries VALUES(10001,85097,'2001-06-22','2002-06-22');
INSERT INTO salaries VALUES(10001,88958,'2002-06-22','9999-01-01');

输出

10001|85097.000|2001-06-22|2002-06-22
10001|97853.800|2002-06-22|9999-01-01
按照正常的逻辑以及之前题目的尿性,要先选出符合条件的 emp_no,即用 INNER JOIN 连接 salaries 和 emp_bonus,且用 s.to_date = '9999-01-01' 表示当前薪水,然后再用 UPDATE ... SET ... WHERE ... IN ... 语句来更新表中数据。
UPDATE salaries SET salary = salary * 1.1 WHERE emp_no IN
(SELECT s.emp_no FROM salaries AS s INNER JOIN emp_bonus AS eb 
ON s.emp_no = eb.emp_no AND s.to_date = '9999-01-01')
但又发现题目测试用例没设置好,emp_bonus里面的全部 emp_no 都是当前获奖的所有员工,于是就有了以下简易答案:
UPDATE salaries SET salary = salary * 1.1 WHERE emp_no IN 
(SELECT emp_no FROM emp_bonus)
谁知道还能继续投机取巧,估计是OJ系统的问题,将所有 salary 都上涨10%也能通过,于是又有了以下终极版最短答案:
UPDATE salaries SET salary = salary * 1.1 
发表于 2017-07-23 11:06:43 回复(46)
更多回答
update salaries 
set salary = salary*1.1 
where emp_no in 
    (
        select emp_no from emp_bonus
    )
and to_date='9999-01-01'
发表于 2022-04-17 19:26:16 回复(0)
select AA.emp_no,
case when aa.to_date='9999-01-01' 
then AA.salary*1.1 else aa.salary end salary2,
AA.from_date,AA.to_date from salaries aa
LEFT JOIN emp_bonus BB 
ON AA.EMP_NO=BB.EMP_NO
where  bb.emp_no is not null 

发表于 2022-02-08 13:11:41 回复(0)
#更新记录语句为 update 表名 set 列名=列值 where限制条件
涨薪直接赋值即可:salary=salary*1.1
update salaries 
set salary=salary*1.1
where emp_no in (select emp_no from  emp_bonus)
and salaries.to_date='9999-01-01';


发表于 2021-01-25 13:53:13 回复(0)
UPDATE salaries
SET salary = salary * 1.1
WHERE to_date = '9999-01-01' AND emp_no IN (
    SELECT emp_no FROM emp_bonus
);

发表于 2019-06-24 13:53:06 回复(0)
update salaries set salary=salary*1.1 where emp_no in (
	select emp_no from emp_bonus
) and to_date='9999-01-01'

发表于 2017-08-31 10:52:42 回复(2)
update salaries set salary=salary*1.1  where emp_no in  (select emp_no from emp_bonus)
找到bonus表中的员工no,然后再更新工资表即可
发表于 2017-12-13 13:12:27 回复(0)
将所有获取奖金的员工当前的(salaries.to_date='9999-01-01')薪水增加10%
***...这题目我看了好几遍,这**是倒装句 ? 
这题目的编写者,我怀疑小学没毕业。
发表于 2021-07-14 19:30:34 回复(0)
思路:先选择符合条件的emp_no,在筛选to_date,最后将符合的字段进行更新。推荐使用内连接查询,速度会快一些。
考点:更新语句的使用,sql里可以使用基本运算(如加减乘除)
方法一:内连接
update salaries T join emp_bonus T2 on T2.emp_no = T.emp_no
set salary = salary * 1.1
where to_date = '9999-01-01'
方法二:子查询
update salaries
set salary = salary * 1.1
where emp_no in (
    select emp_no from emp_bonus
) and to_date = '9999-01-01'


发表于 2021-03-27 15:43:43 回复(1)
这个题目感觉答案有点儿误导人,完全没有从表结构的设计去理解。
仅仅考察一下UPDATE语句。

salaries 很明显根据前面题目可以理解为这是一张薪资历史记录表,to_date是该条薪资截止的日期。
1.插入满足条件的员工的最新薪资记录;
INSERT INTO salaries
SELECT emp_no, salary * 1.1, date('now'), '9999-01-01'
FROM salaries
WHERE emp_no IN (
    SELECT emp_no FROM emp_bonus)
    AND to_date='9999-01-01';

2.将原来的薪资记录的to_date 更新为当前日期,记得排除新插入的记录。
UPDATE salaries
SET to_date = date('now')
WHERE emp_no IN (
    SELECT emp_no FROM emp_bonus)
    AND to_date='9999-01-01'
    AND form_date <> date('now');



发表于 2020-03-28 17:22:01 回复(1)
update salaries
set salary=salary*1.1
where emp_no in (select emp_no from emp_bonus)
and to_date='9999-01-01';

发表于 2020-06-06 17:43:10 回复(2)
我觉得应该加个触发器或者写个事务把原来旧的薪水对应的to_date改成新的日期
发表于 2020-03-08 18:18:42 回复(0)
update 
salaries n
join emp_bonus b 
on n.emp_no = b.emp_no
and n.to_date = '9999-01-01'
set 
n.salary = n.salary*1.1

发表于 2022-06-21 13:41:36 回复(0)
update salaries,emp_bonus set salary=salary*1.1  where emp_bonus.emp_no=salaries.emp_no
and to_date="9999-01-01"
发表于 2021-10-06 14:38:44 回复(0)
UPDATE salaries
SET salary = salary * 1.1
WHERE emp_no in (select emp_no from emp_bonus) and to_date = '9999-01-01'

发表于 2021-09-30 18:16:56 回复(0)
update salaries
set salary = salary*1.1
where emp_no IN (select emp_no from emp_bonus)
and to_date='9999-01-01';

发表于 2021-08-25 11:06:59 回复(0)
UPDATE salaries SET salary = salary * 1.1
WHERE to_date='9999-01-01' AND emp_no IN (SELECT emp_no FROM emp_bonus);

发表于 2021-08-16 20:36:02 回复(0)
update salaries set
salary=salary*1.1 where emp_no in(
select emp_no from emp_bonus
) and to_date="9999-01-01";
发表于 2021-07-06 12:46:07 回复(0)
UPDATE 表名 SET 字段名=值 WHERE
WHERE中的内容:用SELECT语句选出emp_bonus中的所有emp_no,还要筛选一下日期,
UPDATE salaries
SET salary=salary*1.1
WHERE to_date='9999-01-01'
AND emp_no IN (
    SELECT emp_no
    FROM emp_bonus
);
发表于 2021-06-08 22:14:49 回复(0)
这道题是不是有问题呀,题目是将所有获得奖金的员工工资增长0.1,也就是说要先通过inner join on员工编号相同,发送工资日期相同时,得到获得奖金的员工编号,再更新工资表呀。应该是这样的:
update salaries set salary=(1+0.1)*salary where salaries.emp_no in 
select emp_bonus.emp_no from salaries  join emp_bonus on
emp_bonus.recevied=to_date and salaries.emp_no=emp_bonus.emp_no;不知道这样写对不对,望大家指导,但实际上update salaries set salary=(1+0.1)*salary这样才能通过验证。
发表于 2017-07-18 22:51:56 回复(2)

问题信息

难度:
177条回答 15293浏览

热门推荐

通过挑战的用户

查看代码