Sql 子查询返回了多个值。当子查询遵循=、!=、

Sql 子查询返回了多个值。当子查询遵循=、!=、,sql,sql-server,subquery,Sql,Sql Server,Subquery,我有一个查询,通过销售主管更新产品库存主管的可用库存。当销售表具有相同的prd_代码时,它显示错误。我使用发票号作为条件,但它从销售主管处获取所有记录。我的发票号条件在这里不起作用 DECLARE @LoopCounter INT = 1, @MaxCounts INT = (select distinct Count(prd_code) from SALES_D_ORG where INVOICE_NO=@INVOICE_NO) WHILE(@LoopCounter <= @MaxCou

我有一个查询,通过销售主管更新产品库存主管的可用库存。当销售表具有相同的prd_代码时,它显示错误。我使用发票号作为条件,但它从销售主管处获取所有记录。我的发票号条件在这里不起作用

DECLARE @LoopCounter INT = 1, @MaxCounts INT = (select distinct Count(prd_code) from SALES_D_ORG where INVOICE_NO=@INVOICE_NO)
WHILE(@LoopCounter <= @MaxCounts)
BEGIN
update prd_stock set AVAILABLE_STOCK=((select AVAILABLE_STOCK from prd_stock where PRD_CODE=
(Select PRD_CODE From 
( Select  Row_Number() Over (Order By AUTO_NO) As RowNum, * From SALES_D_ORG Where INVOICE_NO=@INVOICE_NO) t2
Where RowNum = @LoopCounter))-(select qty from SALES_D_ORG where PRD_CODE=
(Select PRD_CODE From 
( Select  Row_Number() Over (Order By AUTO_NO) As RowNum, * From SALES_D_ORG  Where INVOICE_NO=@INVOICE_NO) t2
Where RowNum = @LoopCounter))) where PRD_CODE=(Select PRD_CODE From 
( Select  Row_Number() Over (Order By AUTO_NO) As RowNum, * From SALES_D_ORG  Where INVOICE_NO=@INVOICE_NO) t2
Where RowNum = @LoopCounter)
SET @LoopCounter  = @LoopCounter  + 1        
END

你已经在另一篇文章中更新了你的答案,所以我的回答与更新相关。首先,我会以适当的间距将陈述安排在不同的行上,以便其他人能够阅读。将所有内容放在一行上会使代码难以调试

例如:

BEGIN
UPDATE PRD_STOCK 
   SET SOLD_STOCK = (SELECT sum(SALES_D_ORG.QTY) 
                       FROM SALES_D_ORG 
                      WHERE  SALES_D_ORG.PRD_CODE = PRD_STOCK.PRD_CODE) 
 WHERE  EXISTS (SELECT SALES_D_ORG.PRD_CODE 
                  FROM SALES_D_ORG  
                 WHERE SALES_D_ORG.PRD_CODE = PRD_STOCK.PRD_CODE 
                   and SALES_D_ORG.INVOICE_NO = 1)
END

BEGIN
update PRD_STOCK 
   set AVAILABLE_STOCK = BATCH_STOCK-SOLD_STOCK 
 WHERE EXISTS (SELECT SALES_D_ORG.PRD_CODE 
                 FROM SALES_D_ORG 
                WHERE  SALES_D_ORG.PRD_CODE = PRD_STOCK.PRD_CODE 
                  and SALES_D_ORG.INVOICE_NO = 1)
END

我从中了解到,您正在更新2个字段。在第一次更新中,您将更新已售出的库存。如果存在一行SALES\u D\u ORG.PRD\u CODE=PRD\u STOCK.PRD\u CODE和SALES\u D\u ORG.INVOICE\u NO=1,则使用sumSALES\u D\u ORG.QTY更新该字段,其中SALES\u D\u ORG.PRD\u CODE=PRD\u STOCK.PRD\u CODE。我看代码没有问题。由您决定更新背后的逻辑是否正确。同样,我认为第二次更新没有任何问题。作为编码人员,您可以自行确定应用更新的逻辑是否正确。

我认为,您不需要任何while循环或几个子查询。这个脚本做了同样的工作

UPDATE PS
SET 
    AVAILABLE_STOCK = AVAILABLE_STOCK - D.qty
FROM 
    prd_stock PS 
    INNER JOIN 
        ( SELECT PRD_CODE, SUM(qty) qty 
          FROM SALES_D_ORG 
          WHERE INVOICE_NO = @INVOICE_NO
          GROUP BY PRD_CODE ) D ON PS.PRD_CODE = D.PRD_CODE

子查询在查询中没有意义的地方返回多个值。错误消息不能比这更清楚。您的子查询返回的行数超过1行,因此,如果您只需要一行表单子选择,则应限制结果,否则您需要更多行insetad od=您应使用INThanks Tim Biegeleisen和scaisEdge。我已经按照你的建议修改了我的代码。现在我的代码工作得和我预期的一样好。这看起来像是我这样修改代码的可能的副本。它按照我的预期工作。但是,我不知道这是否是从另一个表的特定行更新表中特定行的特定列的正确方法。谢谢,你的回答对我很有用。是的,我已经修改了我的查询。现在我不使用while循环。谢谢你宝贵的回答。
UPDATE PS
SET 
    AVAILABLE_STOCK = AVAILABLE_STOCK - D.qty
FROM 
    prd_stock PS 
    INNER JOIN 
        ( SELECT PRD_CODE, SUM(qty) qty 
          FROM SALES_D_ORG 
          WHERE INVOICE_NO = @INVOICE_NO
          GROUP BY PRD_CODE ) D ON PS.PRD_CODE = D.PRD_CODE