问题描述
我正在使用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语法并有一条记录,那么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(*),但我不知道结果是否正确。这样的结果:--Select for table Trx
select * from Trx where TimeRqTimestamp > DATEADD(HOUR,-1,GETDATE())
and trxresp in (51,55)
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