使用 Sybase ASA11 的案例语句更新记录
Update record with case statement for Sybase ASA11
我正在使用 sybase ASA11。有 2 table、存款 table(列 = 余额、AccountXID)和 Trx Table(列 = TimeRqTimestamp、trxresp)。
我有这样的更新语法
--Update for table Deposit
@Amount = 2000
@Accountxid = 123
update Deposit set Balance = Balance - @Amount where AccountXID = @AccountXID;
如果 SELECT 语法中有一条或更多条记录,那将 运行 table Trx :
--Select for table Trx
select * from Trx where TimeRqTimestamp > DATEADD(HOUR, -1, GETDATE())
and trxresp in (51,55)
我将为数据库中每隔一小时 运行 的事件制作此脚本。
如果我运行这个SELECT语法并且有一条记录,那么余额将更新一次,accountxid 123的金额为2000,然后有2条记录余额将更新一次 AGAIN,accountxid 123 的金额为 2000。如果有 3 条或更多记录,它将再次更新。这取决于在那个时间 运行 事件显示的记录数。
示例 = table 存款 20.000 时帐户 XID 123 中的余额。然后事件运行,在事件运行的最后一小时内table Trx中有4条记录,这意味着从20.000更新4次(20.000 - 2.000 - 2.0000 - 2.000 - 2.000 = 12.000 ) 所以,现在记录余额 12.000
我想要的输出是 table 存款将根据 table Trx 中 select 的每次事件 运行 的记录进行更新。 Tabletrx显示1条记录,Tableupdate会更新一次,Tabletrx显示2条记录,tabledeposit会更新两次
(抱歉英文不好)
已编辑:
我尝试根据所需的输出制作脚本,在这种情况下,我使用来自 table Trx 的每条记录的计数 (*),我不知道结果是否正确.结果是这样的:
begin
declare @ctrx int;
declare @Amount = 2000;
declare @Accountxid = 123;
set @ctrx = (select count(*) from Trx
where
TimeRqTimestamp > DATEADD(HOUR, -1, GETDATE())
and trxresp in (51,55);
update Deposit set Balance = Balance - (@Amount * @ctrx) where AccountXID = @AccountXID;
end;
你应该清楚地解释你想要的输出,关于你提到的 table 的信息(例如它的列、记录等),而不是用示例参数解释你的查询。
您可以查看下面的更新代码,该代码根据 Trx
的记录更新 table Deposit
。可以使用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
我正在使用 sybase ASA11。有 2 table、存款 table(列 = 余额、AccountXID)和 Trx Table(列 = TimeRqTimestamp、trxresp)。
我有这样的更新语法
--Update for table Deposit
@Amount = 2000
@Accountxid = 123
update Deposit set Balance = Balance - @Amount where AccountXID = @AccountXID;
如果 SELECT 语法中有一条或更多条记录,那将 运行 table Trx :
--Select for table Trx
select * from Trx where TimeRqTimestamp > DATEADD(HOUR, -1, GETDATE())
and trxresp in (51,55)
我将为数据库中每隔一小时 运行 的事件制作此脚本。
如果我运行这个SELECT语法并且有一条记录,那么余额将更新一次,accountxid 123的金额为2000,然后有2条记录余额将更新一次 AGAIN,accountxid 123 的金额为 2000。如果有 3 条或更多记录,它将再次更新。这取决于在那个时间 运行 事件显示的记录数。
示例 = table 存款 20.000 时帐户 XID 123 中的余额。然后事件运行,在事件运行的最后一小时内table Trx中有4条记录,这意味着从20.000更新4次(20.000 - 2.000 - 2.0000 - 2.000 - 2.000 = 12.000 ) 所以,现在记录余额 12.000
我想要的输出是 table 存款将根据 table Trx 中 select 的每次事件 运行 的记录进行更新。 Tabletrx显示1条记录,Tableupdate会更新一次,Tabletrx显示2条记录,tabledeposit会更新两次
(抱歉英文不好)
已编辑:
我尝试根据所需的输出制作脚本,在这种情况下,我使用来自 table Trx 的每条记录的计数 (*),我不知道结果是否正确.结果是这样的:
begin
declare @ctrx int;
declare @Amount = 2000;
declare @Accountxid = 123;
set @ctrx = (select count(*) from Trx
where
TimeRqTimestamp > DATEADD(HOUR, -1, GETDATE())
and trxresp in (51,55);
update Deposit set Balance = Balance - (@Amount * @ctrx) where AccountXID = @AccountXID;
end;
你应该清楚地解释你想要的输出,关于你提到的 table 的信息(例如它的列、记录等),而不是用示例参数解释你的查询。
您可以查看下面的更新代码,该代码根据 Trx
的记录更新 table Deposit
。可以使用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