子查询返回了超过1个值。这是不允许的,当子查询跟随=,!=,<, <= , >,> =在SQL Server 2012中

子查询返回了超过1个值。这是不允许的,当子查询跟随=,!=,<, <= , >,> =在SQL Server 2012中

问题描述:

我有一个以下查询来更新销售主数据库主库存。它在销售表具有相同的prd_code时显示错误。我正在使用发票号码作为条件,但它从销售主数据中获取所有记录。我的INVOICE_NO条件在此处不起作用。子查询返回了超过1个值。这是不允许的,当子查询跟随=,!=,<, <= , >,> =在SQL Server 2012中

DECLARE @LoopCounter INT = 1, @MaxCounts INT = (select distinct Count(prd_code) from SALES_D_ORG where [email protected]_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 [email protected]_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 [email protected]_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 [email protected]_NO) t2 
Where RowNum = @LoopCounter) 
SET @LoopCounter = @LoopCounter + 1   
END 
+0

子查询在查询中的某个位置返回多个值,但这没有意义。错误信息不能比这更清楚。 –

+0

你的子查询会返回更多的1行,所以如果你只需要一个行表单子查询,你应该限制结果,否则你需要更多的行insetad od =你应该使用IN – scaisEdge

+0

谢谢Tim Biegeleisen和scaisEdge。我已经修改我的代码作为你的建议。现在我的代码工作正常,因为我expect.This将如下所示 –

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 
+0

我修改了我的代码,就像this.it一样按照我的期望工作。但是,我不知道这是否是更新表中特定行的特定列的正确方法来自另一个表的特定行。请引导我,我是编程新手。谢谢 –

你已经在另一篇文章,所以我的反应它涉及到更新更新你的答案。我会从不同的行上安排适当间隔的陈述开始,以便其他人可读。将所有内容都放在一行上会使代码难以调试。

例如:

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场。在第一次更新中,您更新了SOLD_STOCK。如果存在一行WHERE SALES_D_ORG.PRD_CODE = PRD_STOCK.PRD_CODE and SALES_D_ORG.INVOICE_NO = 1,则用sum(SALES_D_ORG.QTY) WHERE SALES_D_ORG.PRD_CODE = PRD_STOCK.PRD_CODE更新该字段。我没有看到代码错误。您需要决定更新背后的逻辑是否正确。同样,我发现第二次更新没有错。作为编码人员,由您决定是否应用更新的逻辑是正确的。

+0

谢谢,您的回复对我非常有用。 –

我想,你不需要任何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 
+0

是的,我已修改我的查询。现在我不使用while循环。感谢您的宝贵答案。 –

+0

不客气! –