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

在SQL Server中,更新两张相关联的表是经常需要的操作,以下是一些更新两张表的不同写法示例:
假设我们有两张表 Employees 和 SalaryUpdates,我们想要根据 SalaryUpdates 中的新工资来更新 Employees 表中的工资。

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

这是目前最标准的写法

UPDATE a
SET a.Salary = b.NewSalary
FROM Employees a
INNER JOIN SalaryUpdates b ON a.EmployeeID = b.EmployeeID;
  1. 使用子查询更新
    你也可以使用子查询来找出需要更新的值。
    很拗口,不知道好处在哪里。
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语句。
    这种写法可以适应很多场景
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. 使用事务确保数据一致性
    如果更新操作需要保证数据的一致性,可以使用事务。
    语法可以与上面的差不多,可以加入容错等功能
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
);

– 假设还有其他更新操作
– …

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 语句
    这种写法应该适用于多种数据库,不知道是否有人可验证?
UPDATE Employees
SET Salary = NewSalary 
FROM Employees a, SalaryUpdates b 
WHERE a.EmployeeID = b.EmployeeID

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

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-05 11:32:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-05 11:32:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-05 11:32:04       82 阅读
  4. Python语言-面向对象

    2024-04-05 11:32:04       91 阅读

热门阅读

  1. 【leetcode】向字符串添加空格

    2024-04-05 11:32:04       31 阅读
  2. 2024.3.17力扣每日一题——最小高度树

    2024-04-05 11:32:04       33 阅读
  3. Apache Spark 的基本概念和在大数据分析中的应用

    2024-04-05 11:32:04       42 阅读
  4. WPF如何使用 System.Windows.Forms.FolderBrowserDialog

    2024-04-05 11:32:04       33 阅读
  5. 找出字符串中所有偶数的个数

    2024-04-05 11:32:04       36 阅读
  6. 单例模式的多种写法

    2024-04-05 11:32:04       39 阅读
  7. 设计模式:单例模式六种实现

    2024-04-05 11:32:04       36 阅读
  8. 单例模式详解

    2024-04-05 11:32:04       32 阅读
  9. Visual Studio Code(VS Code)安装教程

    2024-04-05 11:32:04       29 阅读
  10. Vue 组件的 mixin 函数,用于屏幕适配

    2024-04-05 11:32:04       38 阅读
  11. 0基础如何进入IT行业

    2024-04-05 11:32:04       33 阅读
  12. C/C++中的static关键字用法总结

    2024-04-05 11:32:04       39 阅读
  13. 梯度反向传播过程是如何处理repeat函数的

    2024-04-05 11:32:04       39 阅读
  14. linux小工具杂记

    2024-04-05 11:32:04       35 阅读