我正在尝试使用属于表LIQUIDITYACCOUNT
的字段QUANTITY
更新表STOCKACCOUNT
。两个表都有外键CLIENT_ID。
update
lq
set
lq.AMOUNT = lq.AMOUNT + ( st.QUANTITY % @num) * @rompu
from
LIQUIDITYACCOUNT lq
inner join STOCKACCOUNT st on
lq.CLIENT_ID = st.CLIENT_ID
and
st.TITRE_ID = @id_titre
and
st.QUANTITY > 0
表STOCKACCOUNT
包含关于客户持有的STOCKS
的信息,而表LIQUIDITYACCOUNT
包含有关现金的信息。如果子查询的结果包含一行,则它可以工作。但它不适用于多行。而在我的项目中通常就是这种情况,因为任何客户都可以持有不同股票的许多股票。
当子查询返回多行时,如何使其工作。
更新的目的似乎很奇怪,但现在是
update lq
set lq.AMOUNT = lq.AMOUNT + stt.qty * @rompu
from LIQUIDITYACCOUNT lq
join ( select st.CLIENT_ID, sum(st.QUANTITY % @num) as qty
from STOCKACCOUNT st
where st.TITRE_ID = @id_titre
and st.QUANTITY > 0
group
by st.CLIENT_ID
) stt
on stt.CLIENT_ID = lq.CLIENT_ID
所以你的lq表上的主键可以是pk。然后用这个逻辑更新lq.AMOUNT的SQL是:
UPDATE
lq
SET
lq.AMOUNT = sq.newvalue
FROM
(
SELECT
lq.AMOUNT + ( st.QUANTITY % @num) * @rompu AS newvalue,
lq.pk
FROM
LIQUIDITYACCOUNT lq
INNER JOIN
STOCKACCOUNT st
ON
lq.CLIENT_ID = st.CLIENT_ID
AND
st.TITRE_ID = @id_titre
AND
st.QUANTITY > 0
) AS sq
WHERE
lq.pk = sq.pk
@tysonwright,@paparazzo和@Dai非常感谢你。我找到了使用cursor
和while
循环的解决方案。下面是代码。
declare @id_client as varchar(50)
declare @amount as money
declare liq_cursor cursor for
SELECT
lq.AMOUNT + ( st.QUANTITY % @num) * @rompu AS newvalue,
lq.CLIENT_ID
FROM
LIQUIDITYACCOUNT lq
INNER JOIN
STOCKACCOUNT st
ON
lq.CLIENT_ID = st.CLIENT_ID
AND
st.TITRE_ID = @id_titre
AND
st.QUANTITY > 0
OPEN liq_cursor
FETCH NEXT FROM liq_cursor into @amount,@id_client
---
WHILE @@FETCH_STATUS=0
BEGIN
update LIQUIDITYACCOUNT set AMOUNT=@amount,
DATEMODIF=GETDATE()
where CLIENT_ID=@id_client
FETCH NEXT FROM liq_cursor into @amount,@id_client
END
close liq_cursor
deallocate liq_cursor