仅更新与另一个表中的行不匹配的行

时间:2018-10-24 14:31:44

标签: sql sql-server tsql

我有3张桌子:

1)tblPerson

id      pin         name       dept_id       
---|-----------|------------|------------|
1  |    123    |    Lisa    |    100     |
2  |    234    |    Rob     |    200     |

2)tblDepartment

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;

1 个答案:

答案 0 :(得分:2)

您当前同时使用d.dept = m.m_dept(在JOIN条件下)和d.dept != m.m_deptWHERE中,因此,您当然不更新任何行。

您使用EXISTSNOT EXISTS,或其他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
;