You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:42:51