sql - 仅在值更改时更新值
问题描述
我必须从另一个表更新 main_table 数据。下面是声明
根据 type_key,我们将在 value_string、value_date 中的任何一列中或为键中的任何一列中获取值。(例如,如果 type_key 是字符串,那么 value_string 将具有值,而 value_date 为空)。有一个触发器可以确保这种约束。
update main_table t set
value_string=value_string,
value_date=value_date,
value_int=value_int,
updated_on=now(),
status=status
from import_table imp where t.key=imp.key
即使 value_string 或 value_date 的值没有变化,updated_on 也会发生变化。我希望仅在值发生变化时更新 updated_on 。所以我将更新查询更改为以下
update main_table t set
value_string=value_string,
value_date=value_date,
updated_on= (case when type_key='string' and t.value_string!=imp.value_string
then now()
when type_key='date' and t.value_date!=imp.value_date
then now()
when type_key='int' and t.value_int!=imp.value_int
then now()
else updated_on end),
status=status
from import_table imp where t.key=imp.key
是否有更好的方法来重写上述查询以提高查询性能?
解决方案
我将添加一个 WHERE 条件,仅在至少有一个值不同时才更改行。
update main_table t
set
value_string = imp.value_string,
value_date = imp.value_date,
value_int = imp.value_int,
updated_on = now(),
status = imp.status
from import_table imp
where t.key = imp.key
and ( t.value_string is distinct from imp.value_string
or t.value_date is distinct from imp.value_date
or t.value_int is distinct from imp.value_int
or t.status is distinct from imp.status);
或者你可以把它写成
where t.key = imp.key
and (t.value_string, t.value_date, t.value_int, t.status)
is distinct from (imp.value_string, imp.value_date, imp.value_int, imp.status);
推荐阅读
- elasticsearch - Elastitcsearch 7:映射类型
- typescript - 为什么我们不应该使用原语的盒装类型版本?
- python - 将xml转换为数据框
- json - 快速解析 json 时出错
- karate - 我们可以使用 Chrome Java API 使用不同的选项自定义 Chrome 浏览器启动吗?
- google-chrome - BLE 浏览器 API startNotifications() 返回“GATT 错误:不支持”。
- vim - coc-nvim 空操作、实现和类型定义提供程序未找到
- python - Snakemake - 如何设置 conda 环境路径
- python - 存储二维数组
- c# - 如何将 Blazor 中的所有注册服务添加到 Simple Injector?