使用案例声明更新Sybase ASA11的记录

问题描述

我正在使用sybase ASA11。有2个表,存款表(列=余额,AccountXID)和Trx表(列= TimeRqTimestamp,trxresp)。

我有这样的更新语法

--Update for table Deposit  
    @Amount = 2000
    @Accountxid = 123    
    
    update Deposit set Balance = Balance - @Amount where AccountXID = @AccountXID;

如果表Trx的 SELECT语法中有记录或更多记录,则将运行

--Select for table Trx 
    select * from Trx  where  TimeRqTimestamp > DATEADD(HOUR,-1,GETDATE()) 
    and trxresp in (51,55)

我将为将在数据库中每隔一小时运行一次的事件制作此脚本。

如果我运行此 SELECT语法并有一条记录,那么Accountxid 123的余额将更新一次,金额为2000,有2条记录,则余额将更新一次 AGAIN ,帐户编号为123的金额为2000。如果有3条或更多记录,它将再次更新。这取决于显示该事件是否在该小时运行的记录。

示例=表存款20.000上AccountXID 123中的余额。然后运行事件,运行事件的最后一小时在表Trx中有4条记录,这意味着从20.000(20.000-2.000-2.0000-2.000-2.000 = 12.000)更新了4次,所以现在记录在余额上12.000

我想要的输出是表存款,每次运行时都会根据记录更新记录Trx。表Trx显示1条记录,表更新将更新一次,表Trx显示2条记录,表存款将更新两次。

(对不起,英语很差)

已编辑:

我尝试根据所需的输出制作脚本,在这种情况下,我使用表Trx中每个记录的count(*),但我不知道结果是否正确。这样的结果:

begin
    declare @ctrx int;
    declare @Amount = 2000;
    declare @Accountxid = 123;
    
    set @ctrx = (select count(*) from Trx   
                    where 
                    TimeRqTimestamp > DATEADD(HOUR,GETDATE())
                    and trxresp in (51,55);
                    
    update Deposit set Balance = Balance - (@Amount * @ctrx) where AccountXID = @AccountXID;
end;

解决方法

您应该清楚地说明所需的输出,所提及表的信息(例如其列,记录等),而不要使用示例参数来解释查询。

您可以根据Deposit的记录在更新表Trx下方签出更新代码。您可以使用COUNT聚合功能来计算记录数量,然后更新余额。

@Amount = 2000
@Accountxid = 123

WITH Account_Deposit (AccountXID,Balance)
AS
(
SELECT
    AccountXID,COUNT(*) AS Record_Amount
FROM
    Trx
GROUP BY
    AccountXID
)
UPDATE
    Deposit
SET
    Balance = Balance - (Account_Deposit.Record_amount*@Amount)
FROM
    Deposit
INNER JOIN
    Account_Deposit
ON
    Deposit.AccountXID = Account_Deposit.AccountXID

如果您只想更新帐户ID'123',请在下面添加您的条款

WHERE AccountXID = @AccountXID