首页 > 解决方案 > 仅更新与另一个表中的行不匹配的行

问题描述

我有 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;

标签: sqlsql-servertsql

解决方案


您当前同时使用d.dept = m.m_dept(在JOIN条件中)和d.dept != m.m_dept在中WHERE,所以当然您没有更新任何行。

您要么使用EXISTSor 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
;

推荐阅读