C# 如何使用SQL Server中返回多行的子查询更新表?
我正在尝试使用属于表STOCKACCOUNT的字段QUANTITY更新表LIQUIDITYACCOUNT。两个表都有外键客户端IDC# 如何使用SQL Server中返回多行的子查询更新表?,c#,sql,sql-server,C#,Sql,Sql Server,我正在尝试使用属于表STOCKACCOUNT的字段QUANTITY更新表LIQUIDITYACCOUNT。两个表都有外键客户端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
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表包含关于客户持有的股票的信息,而LIQUIDITYACCOUNT表包含关于现金的信息。
如果子查询的结果包含一行,则它可以工作。但它不适用于多行。在我的项目中通常是这样,因为任何客户都可以持有不同股票的许多股份
当子查询返回多行时,如何使其工作 因此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
更新的目的似乎很奇怪,但在这里它是
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
,非常感谢你。我已经找到了一个使用游标和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
如果它返回多行,您希望更新哪一行?这是一个业务逻辑问题,这个问题中没有足够的信息让人回答。谢谢,假设子查询返回的每一行都应该使用公式*lq.AMOUNT=lq.AMOUNT+st.QUANTITY%@num*@rompu*@MahamaneSaniIbrahim来更新。很抱歉,不工作并不会给我带来太多的麻烦。是否可以使用“while”循环执行它?@MahamaneSaniIbrahim不买我的更新会抛出那个错误。祝你好运