sql - 仅更新与另一个表中的行不匹配的行
问题描述
我有 3 张桌子:
1) tblPerson
id pin name dept_id
---|-----------|------------|------------|
1 | 123 | Lisa | 100 |
2 | 234 | Rob | 200 |
2) tbl 部门
id dept_name
-----|-----------|
100 | IT |
200 | HR |
3) tblMaster
id emplid name m_dept
---|-----------|------------|------------|
1 | 123 | Lisa | IT |
2 | 234 | Rob | HR |
• tblDepartment 从 tblMaster 中存在的现有部门获取其行
• 在 tblPerson 中,dept_id 是来自 tblDepartment 的外键
我正在尝试创建一个查询,该查询将更新 tblPerson 中 m_dept 与链接到人员的 dept_id 的 dept_name 不匹配的所有行的 dept_id。
例如,如果在 tblMaster 中,我将 m_dept 下的“IT”从第 1 行更改为“HR”,运行查询会将 tblPerson 中第 1 行的 dept_id 更改为“200”
SQL查询:
UPDATE [dbo].[tblPerson]
SET dept_id = d.id
FROM [dbo].[tblMaster] m
INNER JOIN [dbo].[tblPerson] p
ON p.pin = m.emplid
INNER JOIN [dbo].[tblDepartment] d
ON d.dept = m.m_dept
上面的查询将更新所有行..当我尝试添加时:
WHERE d.dept != m.m_dept
我将 tblMaster 中第 1 行的 m_dept 'IT' 更改为 'HR' ..它没有更新任何内容
需要帮助请;m;
解决方案
您当前同时使用d.dept = m.m_dept
(在JOIN
条件中)和d.dept != m.m_dept
在中WHERE
,所以当然您没有更新任何行。
您要么使用EXISTS
or NOT EXISTS
,要么使用 another JOIN
:
UPDATE P
SET P.dept_id = D1.id
FROM dbo.tblPerson P
INNER JOIN dbo.tblMaster M
ON P.pin = M.emplid
INNER JOIN dbo.tblDepartment D1
ON D1.dept_name = M.m_dept
INNER JOIN dbo.tblDepartment D2
ON P.dept_id = D2.id
WHERE D1.dept_name <> D2.dept_name
;
推荐阅读
- python-module - ImportError:在 MacOS 上没有名为“pystan”的模块
- c - 在保留顺序的同时从排序列表中删除重复项问题中,我不知道为什么会出现运行时错误?
- websocket - FastAPI:WebSocket 连接在约 40 秒后关闭
- java - java.policy 和 catalina.policy 的区别?
- php - 引用另一列的子串后自动填充sql列数据
- javascript - AJAX 添加到购物车代码没有错误,但不能与 PHP MYSQL 一起运行
- html - HTML 移动重定向 - 避免在应用程序中打开
- python - Python regex - 从数字字符开始匹配
- python - python structlog - 我可以动态更改日志级别但仅适用于特定类吗?
- r - 如何在 R 中获取托管在 gitlab 上的远程文件?