如何在NOT EXISTS关联查询中显示额外列并实现Hash自动更新
解决方案
1. 查询差异记录并获取OrderBodyId
要筛选出Hash值不一致的记录,同时带出IntegrationMapping表的OrderBodyId,可以通过关联两张表(匹配除Hash外的主键字段)实现:
SELECT r.Id, r.ExternalId, r.Salary, r.EntityId, r.Hash AS 最新Hash, im.Hash AS 旧Hash, im.OrderBodyId FROM ContractInnerJoin r JOIN IntegrationMapping im ON im.EntityInstanceId = r.Id AND im.ExternalId = r.ExternalId AND im.EntityId = r.EntityId WHERE r.ExternalId = 35 AND im.Hash <> r.Hash;
这个查询会直接返回ContractInnerJoin中因Salary修改导致Hash变化的记录,同时展示IntegrationMapping里对应的旧Hash和OrderBodyId。
2. 更新IntegrationMapping的Hash值
要将IntegrationMapping中不一致的Hash同步为ContractInnerJoin的最新值,使用UPDATE ... FROM ... JOIN语法:
UPDATE im SET im.Hash = r.Hash FROM IntegrationMapping im JOIN ContractInnerJoin r ON im.EntityInstanceId = r.Id AND im.ExternalId = r.ExternalId AND im.EntityId = r.EntityId WHERE im.Hash <> r.Hash;
如果只需要处理ExternalId=35的记录,在WHERE后追加AND r.ExternalId = 35即可。
3. 创建自动更新的存储过程
把更新逻辑封装成存储过程,方便重复执行:
CREATE PROCEDURE SyncContractHash @ExternalId INT = NULL -- 可选参数,指定同步的ExternalId,不传则同步所有差异记录 AS BEGIN SET NOCOUNT ON; UPDATE im SET im.Hash = r.Hash FROM IntegrationMapping im JOIN ContractInnerJoin r ON im.EntityInstanceId = r.Id AND im.ExternalId = r.ExternalId AND im.EntityId = r.EntityId WHERE im.Hash <> r.Hash AND (@ExternalId IS NULL OR r.ExternalId = @ExternalId); -- 可选:返回本次更新的记录数 SELECT @@ROWCOUNT AS 更新记录数; END;
使用示例:
- 同步所有差异记录:
EXEC SyncContractHash; - 仅同步ExternalId=35的记录:
EXEC SyncContractHash @ExternalId = 35;
内容的提问来源于stack exchange,提问作者Vladut
相关产品推荐
相关产品推荐

