如何无需关联salaries、titles、employees表更新Assistant Engineer的薪资?
问题解答
首先明确:可以不用写显式的多表内连接语法,但要筛选出Assistant Engineer的薪资记录,还是得通过emp_no关联salaries和titles表——毕竟薪资数据在salaries,职位信息在titles,两者靠员工编号关联,绕不开这个关联逻辑,只是写法可以换。
你的脚本存在的问题
- 子查询
(SELECT salaries.emp_no, titles.title FROM salaries)没有关联titles表,会产生无效的笛卡尔积,完全不符合需求 SET s.salary = salaries + 500里的salaries未指定别名,应该用s.salary- 语法结构错误:
INNER JOIN后的子查询缺少关联条件,括号不匹配,WHERE子句引用titles表但未正确关联 - 存储过程结尾缺少必要的
;
替代写法(无需显式多表内连接的写法)
可以用WHERE EXISTS子查询来关联titles表,这样写法上避免了显式内连接,同时实现需求:
DELIMITER // DROP PROCEDURE IF EXISTS psegui3 // CREATE PROCEDURE psegui3() BEGIN -- 给当前在职的Assistant Engineer加薪500 UPDATE salaries s SET s.salary = s.salary + 500 WHERE s.to_date = '9999-01-01' AND EXISTS ( SELECT 1 FROM titles t WHERE t.emp_no = s.emp_no AND t.title = 'Assistant Engineer' AND t.to_date = '9999-01-01' ); END // DELIMITER ;
补充说明
如果完全不关联任何表,根本无法定位到Assistant Engineer的薪资记录——因为salaries表本身没有职位信息,必须依赖titles表的职位筛选。上面的写法用EXISTS替代了显式的INNER JOIN,满足你不想用内连接语法的需求。
内容的提问来源于stack exchange,提问作者rino
相关产品推荐
相关产品推荐

