数据库更新两张相关联的表

在SQL Server中,更新两张相关联的表是经常需要的操作,以下是一些更新两张表的不同写法示例:

假设我们有两张表 Employees 和 SalaryUpdates,我们想要根据 SalaryUpdates 中的新工资来更新 Employees 表中的工资。

  1. 使用内连接(INNER JOIN)更新

这是目前最标准的写法

sql 复制代码
UPDATE a
SET a.Salary = b.NewSalary
FROM Employees a
INNER JOIN SalaryUpdates b ON a.EmployeeID = b.EmployeeID;
  1. 使用子查询更新
    你也可以使用子查询来找出需要更新的值。
    很拗口,不知道好处在哪里。
sql 复制代码
UPDATE Employees
SET Salary = (SELECT NewSalary FROM SalaryUpdates WHERE SalaryUpdates.EmployeeID = Employees.EmployeeID)
WHERE EXISTS (
    SELECT 1 FROM SalaryUpdates WHERE SalaryUpdates.EmployeeID = Employees.EmployeeID
);
  1. 使用CASE语句更新
    如果你需要根据某些条件来决定如何更新目标表,可以使用CASE语句。
    这种写法可以适应很多场景
sql 复制代码
UPDATE Employees
SET Salary = CASE
    WHEN Salary < (SELECT AVG(Salary) FROM Employees) THEN Salary * 1.10
    WHEN Salary > (SELECT AVG(Salary) FROM Employees) THEN Salary * 0.90
    ELSE Salary
END
WHERE EXISTS (
    SELECT 1 FROM SalaryUpdates WHERE SalaryUpdates.EmployeeID = Employees.EmployeeID
);
  1. 使用事务确保数据一致性
    如果更新操作需要保证数据的一致性,可以使用事务。
    语法可以与上面的差不多,可以加入容错等功能
sql 复制代码
BEGIN TRANSACTION;

UPDATE Employees
SET Salary = (SELECT NewSalary FROM SalaryUpdates WHERE SalaryUpdates.EmployeeID = Employees.EmployeeID)
WHERE EXISTS (
    SELECT 1 FROM SalaryUpdates WHERE SalaryUpdates.EmployeeID = Employees.EmployeeID
);

-- 假设还有其他更新操作

-- ...

sql 复制代码
IF @@ERROR = 0
BEGIN
    COMMIT TRANSACTION;
    PRINT 'Updates were committed.';
END
ELSE
BEGIN
    ROLLBACK TRANSACTION;
    PRINT 'Updates were rolled back due to an error.';
END
  1. 传统的where 语句
    这种写法应该适用于多种数据库,不知道是否有人可验证?
sql 复制代码
UPDATE Employees
SET Salary = NewSalary 
FROM Employees a, SalaryUpdates b 
WHERE a.EmployeeID = b.EmployeeID

操作后,验证数据以确保更新正确无误。

相关推荐
RestCloud6 小时前
借助ETL工具,实现AI智能体+数据的落地
数据仓库·人工智能·sql·etl·etlcloud·数据集成平台·java脚本
小二·7 小时前
RAG + 向量数据库实战:ChromaDB / Milvus / FAISS 选型与性能横评
数据库·milvus·faiss
矜持的左手7 小时前
电子小白的枕边书:电子学(The Art of Electronics)
数据库·restful
吴声子夜歌7 小时前
Redis 5.x——布隆过滤器
数据库·redis·缓存
蓝天下的守望者8 小时前
svt_apb_if里的宏定义问题
运维·服务器·数据库
上海云盾-小余8 小时前
网站频繁遭遇 SQL 注入溯源与原生漏洞修复全流程总结
数据库·sql
数据库小学妹8 小时前
国家区域医疗中心国产化改造实战:数据库选型、跨院区数据互通与踩坑经验
数据库·国产数据库·数据库选型·医疗信息化·信创数据库·医疗信创
AllData公司负责人10 小时前
数据库同步平台|AIIData数据中台实现OceanBase、达梦数据库、OpenGauss、人大金仓、Hive、TDengine 一键接入Doris
大数据·数据库·hive·mysql·oceanbase·tdengine
2603_9547083110 小时前
全维度容错设计,打造微电网安全运行屏障
服务器·网络·数据库·人工智能·分布式·安全