C# 如何使用SQL Server中返回多行的子查询更新表?

C# 如何使用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

我正在尝试使用属于表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
        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不买我的更新会抛出那个错误。祝你好运