如何基于Table B的条件更新SQL Server中Table A的指定列
正确的SQL Server更新语句写法
先修正你原语句里的几个明显问题:
- 更新语句的WHERE子句不能嵌套多层
WHERE,语法完全错误 - 表名拼写笔误:
do.tableA应该是dbo.tableA - SQL Server里字符串常量必须用单引号,不能用双引号(也就是
'good'而非"good") - 子查询里的
distinct是多余的,因为employee_number是主键,本身就唯一
下面给你两种靠谱的写法:
方法1:用IN子查询实现
UPDATE dbo.TableA SET value = 'good' -- 条件1:员工在TableB中且状态为激活 WHERE employee_number IN ( SELECT employee_number FROM dbo.TableB WHERE active_or_inactive = 'a' ) -- 条件2:该员工在TableA中没有pref='work'的记录 AND employee_number NOT IN ( SELECT employee_number FROM dbo.TableA WHERE pref = 'work' )
方法2:用JOIN关联表(推荐,大数据量下性能更好)
UPDATE a SET a.value = 'good' FROM dbo.TableA a -- 关联TableB,筛选激活状态的员工 JOIN dbo.TableB b ON a.employee_number = b.employee_number WHERE b.active_or_inactive = 'a' -- 排除掉TableA中pref='work'的员工 AND NOT EXISTS ( SELECT 1 FROM dbo.TableA a2 WHERE a2.employee_number = a.employee_number AND a2.pref = 'work' )
额外提示:
- 执行更新前,建议先跑下面的SELECT语句确认要更新的记录是否正确,避免误操作:
SELECT a.employee_number, a.value, a.pref, b.active_or_inactive FROM dbo.TableA a JOIN dbo.TableB b ON a.employee_number = b.employee_number WHERE b.active_or_inactive = 'a' AND NOT EXISTS ( SELECT 1 FROM dbo.TableA a2 WHERE a2.employee_number = a.employee_number AND a2.pref = 'work' )
- 因为
employee_number是主键,JOIN的时候不会出现一条记录被多次匹配的问题,放心用就行
内容的提问来源于stack exchange,提问作者Arina Pelagiya
相关产品推荐
相关产品推荐

