SQL 当相关行存在时更新记录,你想更新一个表的部分行,而更新条件取决于另一个表中是否有与之相关的行。例如,如果一个员工出现在 EMP_BONUS
表中,你希望把他的工资(在 EMP
表中)上涨 20%。下面的结果集显示了 EMP_BONUS
表当前的数据。
SQL 当相关行存在时更新记录 问题描述
你想更新一个表的部分行,而更新条件取决于另一个表中是否有与之相关的行。例如,如果一个员工出现在 EMP_BONUS
表中,你希望把他的工资(在 EMP
表中)上涨 20%。下面的结果集显示了 EMP_BONUS
表当前的数据。
select empno, ename
from emp_bonus
EMPNO ENAME
---------- ----------
7369 SMITH
7900 JAMES
7934 MILLER
SQL 当相关行存在时更新记录 解决方案
在 UPDATE
语句的 WHERE
子句里使用一个子查询来检索同时存在于 EMP
表和 EMP_BONUS
表的员工。这样 UPDATE
语句就能只检索那些员工的记录,并为其增加 20% 的工资。
1 update emp
2 set sal=sal*1.20
3 where empno in ( select empno from emp_bonus )
SQL 当相关行存在时更新记录 扩展知识
上述子查询的结果集代表了 EMP
表中将要被更新的行。IN
谓词用于评估 EMP
表中的 EMPNO
列是否存在于上述子查询返回的 EMPNO
列表里。如果是的话,相应的 SAL
值就会被更新。
除了 IN
谓词,也可以使用 EXISTS
。
update emp
set sal = sal*1.20
where exists ( select null
from emp_bonus
where emp.empno=emp_bonus.empno )
你可能会惊讶于 EXISTS
子查询的 SELECT
列表只有一个 Null
。不必担心,那个 Null
对更新操作没有负面影响。我认为这样做反而提高了查询语句的可读性,因为它强调了这样一个事实:真正决定更新操作的(例如,哪些行会被更新)是子查询里的 WHERE
子句,而不是 SELECT
列表。这与本解决方案里使用的 IN
谓词和子查询不同。