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

问题描述 投票:0回答:3

我正在尝试使用属于表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包含有关现金的信息。如果子查询的结果包含一行,则它可以工作。但它不适用于多行。而在我的项目中通常就是这种情况,因为任何客户都可以持有不同股票的许多股票。

当子查询返回多行时,如何使其工作。

c# sql sql-server
3个回答
1
投票

更新的目的似乎很奇怪,但现在是

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

0
投票

所以你的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

0
投票

@tysonwright@paparazzo@Dai非常感谢你。我找到了使用cursorwhile循环的解决方案。下面是代码。

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
© www.soinside.com 2019 - 2024. All rights reserved.