新增用户或费用变更时,如何重新生成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)
执行逻辑
每次需要更新费用时,按顺序执行上述步骤(可选步骤根据业务需求决定)即可:
- 先同步已存在记录的变更
- 再新增缺失的用户/费用项记录
- 最后清理无效记录(如果需要)
内容的提问来源于stack exchange,提问作者Royhan Sajib
相关产品推荐
相关产品推荐

