Sql server 如何更新除SQL中的记录外的其他记录
我正在比较SQL中不同数据库的两个表(单向)。 我只想用这些差异更新第二个表。 比较部分给出了正确的结果,但我不知道如何在更新部分得到这些结果Sql server 如何更新除SQL中的记录外的其他记录,sql-server,compare,Sql Server,Compare,我正在比较SQL中不同数据库的两个表(单向)。 我只想用这些差异更新第二个表。 比较部分给出了正确的结果,但我不知道如何在更新部分得到这些结果 -- The comparing part DB1 with DB2 WITH RecordsWithUpdates AS (SELECT DeviceID, DeviceName, DeviceNumber, Active FROM DB1.dbo.devices EXCEPT SELECT DeviceID, Devi
-- The comparing part DB1 with DB2
WITH RecordsWithUpdates AS
(SELECT DeviceID, DeviceName, DeviceNumber, Active FROM DB1.dbo.devices
EXCEPT
SELECT DeviceID, DeviceName, DeviceNumber, Active FROM DB2.dbo.devices
)
-- displaying the differences
Select * from DB2.dbo.Devices
WHERE DeviceID IN (SELECT DeviceID FROM RecordsWithUpdates)
-- Updating then columns of DB2
Update DB2.dbo.devices SET DeviceName = ?????, SET DeviceNumber = ??????, Active = ???????
代码部分与?????是它应该插入发现的差异的地方,但我无法让它工作。我将通过
更新来解决这个问题。。。设置从…起JOIN
语法,如:
UPDATE
t2
SET
t2.DeviceName = t1.DeviceName,
t2.DeviceNumber = t1.DeviceNumber,
t2.Active = t1.Active
FROM
DB2.dbo.devices t2
INNER JOIN DB1.dbo.devices t1
ON t1.DeviceID = t2.DeviceID
AND NOT (
t1.DeviceName = t2.DeviceName
AND t1.DeviceNumber = t2.DeviceNumber
AND t1.Active = t2.Active
)
如果要同时插入尚未存在的记录,则可以使用
合并
语法:
MERGE DB2.dbo.devices t2
USING DB1.dbo.devices t1
ON (t1.DeviceID = t2.DeviceID)
WHEN MATCHED
THEN UPDATE SET
t2.DeviceName = t1.DeviceName,
t2.DeviceNumber = t1.DeviceNumber,
t2.Active = t1.Active
WHEN NOT MATCHED
THEN INSERT(DeviceID, DeviceName, DeviceNumber, Active)
VALUES (t1.DeviceID, t1.DeviceName, t1.DeviceNumber, t1.Active)
最后:如果要删除t2
中存在但不在t1
中的记录,只需将其添加到合并
查询的末尾:
WHEN NOT MATCHED BY SOURCE
THEN DELETE;
表上的主键是什么?查看代码,我知道它不仅仅是
DeviceID
,否则select
查询将永远不会返回任何内容。这将确定更新的联接条件,否则您可能会在更新后出现多个不可区分的行。两个表上的主键都是DeviceID Hank GMB这适用于两个表中存在的DeviceID!但是,如果T1创建了一条新记录,但该记录在T1中并不存在,那么我如何更改代码以在T2中插入新行呢?@Karstieman:啊,好吧,这在你的问题中并不明显。我用一个使用MERGE
的解决方案更新了我的答案。是的,非常感谢!!这正是我要找的。