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

新增用户或费用变更时,如何重新生成Fees表数据并避免重复?

解决费用表更新与新增问题

问题分析

你之前的IF NOT EXISTS逻辑存在问题:它是判断是否存在任何匹配记录,而非针对单个用户-费用项组合做判断。只要表中有一条记录就会进入更新分支,既无法处理新用户新增、费用项新增的场景,也无法精准更新已有记录的变更。

解决方案

我们分三步处理,无需用整体的IF ELSE包裹:更新已有费用记录、插入新用户/新费用项的记录、(可选)清理已停用的费用记录。

1. 更新已有费用记录

同步FeesSetup中变更的费用信息到Fees表,仅更新有实际变化的记录,避免无意义操作:

UPDATE f
SET 
    FeesTypeID = fs.FeesTypeID,
    FeesHeadID = fs.FeesHeadID,
    Fee = fs.Fee
FROM Fees f
JOIN FeesSetup fs ON f.FeesSetupID = fs.FeesSetupID
JOIN UserList ul ON f.UserID = ul.UserID
WHERE 
    f.InstituteID = @InstituteID
    AND fs.InstituteID = @InstituteID
    AND fs.IsActive = 1
    AND f.MonthID = @MonthID
    -- 仅当字段有变化时执行更新
    AND (f.FeesTypeID <> fs.FeesTypeID OR f.FeesHeadID <> fs.FeesHeadID OR f.Fee <> fs.Fee)

2. 插入新用户/新费用项的记录

针对UserList中的新用户,或FeesSetup中新增的启用费用项,插入未存在的费用记录:

INSERT INTO Fees(FeesTypeID, FeesSetupID, FeesHeadID, Fee, MonthID, InstituteID, UserID)
SELECT 
    fs.FeesTypeID,
    fs.FeesSetupID,
    fs.FeesHeadID,
    fs.Fee,
    @MonthID,
    fs.InstituteID,
    ul.UserID
FROM UserList ul
CROSS JOIN FeesSetup fs
LEFT JOIN Fees f ON 
    ul.UserID = f.UserID 
    AND fs.FeesSetupID = f.FeesSetupID
    AND f.MonthID = @MonthID
    AND f.InstituteID = @InstituteID
WHERE 
    ul.InstituteID = @InstituteID
    AND fs.InstituteID = @InstituteID
    AND fs.IsActive = 1
    AND f.UserID IS NULL -- 仅插入未存在的记录

3. (可选)清理已停用的费用记录

如果业务要求移除FeesSetup中已停用(IsActive=0)的费用项对应的记录,可执行:

DELETE f
FROM Fees f
LEFT JOIN FeesSetup fs ON f.FeesSetupID = fs.FeesSetupID
WHERE 
    f.InstituteID = @InstituteID
    AND f.MonthID = @MonthID
    AND (fs.IsActive = 0 OR fs.FeesSetupID IS NULL)

执行逻辑

每次需要更新费用时,按顺序执行上述步骤(可选步骤根据业务需求决定)即可:

  1. 先同步已存在记录的变更
  2. 再新增缺失的用户/费用项记录
  3. 最后清理无效记录(如果需要)

内容的提问来源于stack exchange,提问作者Royhan Sajib

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:05:31