多次插入,更新和删除

时间:2014-06-25 06:53:50

标签: sql sql-server sql-server-2008-r2

我有三张桌子

现在,历史和保留表

到那天结束时,我必须清除整个目前的表格数据  如果在历史记录表中存在具有现有ID的Id,则我必须查看余额,然后从该表中减去当前余额。

如果平衡 - 电流平衡< 0然后从历史表中减去余额使其为零并在历史表中添加一个新行,其中currentbalance-balance为余额

如果历史记录表和currentbalance中没有ID> 0移动该记录以保存表。

如果currentbalance< = 0将当前表中的日期更改为第二天。我只需要一个查询就可以了。

如果保留表中有记录删除该记录并放置最新记录。

每次更新行时,请将DATE列更改为当前日期,而不是当前日期。

现:

ID      Current_Balance    Date
 1        2000              25-06-2014
 2        1500              25-06-2014
 3        5000              25-06-2014
 2        6000              25-06-2014
 4        -200              25-06-2014

历史:

 ID       Balance           Date
 1        1500             24-06-2014
 2        1600             24-06-2014

保持表:

 ID       Balance           Date
 3         125             24-06-2014
 4         2000            24-06-2014 

我想要结果  本:

 ID      Current_Balance     Date
 4       -200                26-06-2014

历史:

 Id    Balance              Date
 1     0                    25-06-2014
 1     500                  25-06-2014
 2     100                  25-06-2014           

保持:

 ID      Balance            Date
 3        5000              25-06-2014
 4        2000              24-06-2014

我编写的代码有点复杂。任何人都可以为此提供最佳解决方案。

1 个答案:

答案 0 :(得分:1)

使用以下查询:

UPDATE Persent
SET current_Balance = 0,
    Date = GETDATE()
OUTPUT Inserted.ID, Deleted.current_Balance, Deleted.Date
INTO #P
FROM History h
WHERE h.Id = Persent.ID
    AND  h.balance - Persent.current_balance < 0


INSERT INTO History (Id, Balance, Date)
SELECT p.Id, p.Current_Balance, p.Date
FROM #P p

MERGE Hold AS Destination
 USING (SELECT * FROM Present WHERE Current_Balance>0) AS Source ON Destination.Id = Source.Id
 WHEN NOT MATCHED THEN INSERT (Id, Balance, Date) VALUES (ID,Current_Balance,Date)
 WHEN MATCHED THEN DELETE


UPDATE Persent
SET Date = DATEADD(DAY, 1, GETDATE())
WHERE Persent.current_balance <= 0