4.09 当相应行存在时更新

问题:
仅当另一个表中相应的行存在时,更新某表中的一些行。例如,如果表emp_bonus中存在某位员工,则要将该员工的工资增加20%(在表emp中)。

解决方案:
为了可以将符合条件的员工工资增加20%,可以在update语句的where子句中使用子查询,用以找出哪些员工同时存在于表emp和emp_bonus中

update emp set sal = sal*1.20
    where empno in (select empno from emp_bonus)

讨论:
子查询返回的结果集确定了在表emp中哪些行可以被更新。谓词in用来检验emp中的empno值是否包含在由子查询返回的empno值列表当中,在此列表中时,相应的sal值被更新。

还可以使用exists子句来替代in:

update emp
    set sal = sal * 1.20
where exists (
    select null from emp_bonus 
        where emp.empno = emp_bonus.empno
)

读者可能会奇怪在exists子查询中select列表中的NULL值,不要惊讶,NULL值对更新操作没有任何不利影响,我认为这样既增加了该语句的可读性,而且还强调了一个事实:与使用in操作符的查询不同,使用exists的解决方案中,由子查询的where子句决定要更新哪些行,而不是由子查询的select列表中的值决定

时间: 2024-10-22 23:34:20

4.09 当相应行存在时更新的相关文章

mysql ON DUPLICATE KEY UPDATE重复插入时更新

mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (client_id,client_name,client_type) SELECT supplier_id,supplier_name,'advertising' FROM suppliers WHERE not exists(select * from clients where clients.c

mysql命令行,多行命令时如何取消/返回修改前边的命令

mysql命令行中执行多行命令时,如果前边输入的命令发生错误,是无法返回修改的,但是可以通过输入\c来取消前边的输入,但是这时如果前边输入的东西很多,直接取消又很可惜的话,可以通过\p来打印出前边的命令,复制下来去修改,然后输入\c取消来重新输入命令. Example 1 2 3 4 5 6 7 8 9 10 11 12 13 mysql> select 8 from a     -> where 1=1     ->  and 1=0     -> \p #输入\p后,打印出了前

LigerUi-Js中Grid行修改时,不执行保存事件的原因?(已解决)

(1) (2)下面代码写在grid上面 function itemclick1(item) { var editingrow = grid.getEditingRow(); switch (item.text) { case "增加": if (editingrow == null) { grid.addEditRow(); } else { LG.tip('请先提交或取消'); } break; case "修改": var selected = grid.get

ENode 2.6 - 关于聚合根一次产生多个领域事件时更新读库的方案设计

最近在用ENode开发conference案例时,遇到一个问题,写篇文章分享一下. 问题背景 Conference案例,是一个关于在线创建会议(类似QCon这种全球开发者大会).在线管理会议位置信息.在线预订某个会议的位置的,这样一个系统.具体可以看微软的这个项目的主页:http://cqrsjourney.github.io. 然后我们设计了一个Conference聚合根,对应领域中的会议这个领域概念.Conference聚合根下面,有一些位置信息SeatType.一个会议聚合根下面可以添加不

oracle ORA_ROWSCN 行记录的更新时间

在这介绍两个oracle 10G开始提供的一个伪列ORA_ROWSCN,它又分为两种模式一种是基于block,这是默认的模式,还有一种是基于row上,这种模式只能在建里表时指定ROWDEPENDENCIES,不可以通过后期的alter table ,同时会给数据库带来性能负载每个Block在头部是记录了该block最近事务的SCN的,所以默认情况下,只需要从block头部直接获取这个值就可以了,不需要其他任何的开销,Oracle就能做到这一点.但是这明显第一种模式是scn是不准确的,因为不可能每

EF core (code first) 通过自定义 Migration History 实现多租户使用同一数据库时更新数据库结构

前言 写这篇文章的原因,其实由于我写EF core 实现多租户的时候,遇到的问题. 具体文章的链接: Asp.net core下利用EF core实现从数据实现多租户(1) Asp.net core下利用EF core实现从数据实现多租户(2) : 按表分离   (主要关联文章) 这里我遇到的最主要问题是:由于多租户的表使用的是同一个数据库.由于这个原因,无法通过 Database.EnsureCreated() 自动创建多个结构相同但名字不同的表. 所以我在文中提到,需要自己跑脚本去创建多有的

SSIS package 在运行时更新 variable

在Package中声明一个variable,在package运行的过程中,SSIS如何update Variable? 第一种方法:使用 Script Task 来更新Variable的值 1,创建一个variable ,VariableName是VarCode,并将变量传递到脚本的ReadWriteVariables数组中. 2,在C#脚本中,SSIS提供两种方式访问变量,第一种方式比较简单,推荐使用. //读写变量 第一种方式 string VarName = this.Dts.Variab

GridView行编辑、更新、取消、删除事件使用方法

注意:当启用编辑button时,点击编辑button后会使一整行都切换成文本框.为了是一行中的一部分是文本框,须要把以整行的全部列都转换成模板,然后删掉编辑模板中的代码.这样就能使你想编辑的列转换成文本框. 1.界面 <asp:GridView ID="GridView1" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None&qu

hibernate一对多单向关联时更新问题

需求:修改一个联系人,为其重新分配客户 问题:当更新一个托管态/持久态对象时,该对象关联了一个临时态对象,会报错 解决办法:使用级联保存更新 要更新谁,就在谁的映射文件中配置 <!-- 一对多关系映射: set元素的属性: cascade:级联操作. 取值: save-update:级联保存更新 delete:级联删除.--> <set name="linkmans" table="cst_linkman" cascade="save-u