子查询返回了超过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
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
我修改了我的代码,就像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
更新该字段。我没有看到代码错误。您需要决定更新背后的逻辑是否正确。同样,我发现第二次更新没有错。作为编码人员,由您决定是否应用更新的逻辑是正确的。
谢谢,您的回复对我非常有用。 –
我想,你不需要任何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
是的,我已修改我的查询。现在我不使用while循环。感谢您的宝贵答案。 –
不客气! –
子查询在查询中的某个位置返回多个值,但这没有意义。错误信息不能比这更清楚。 –
你的子查询会返回更多的1行,所以如果你只需要一个行表单子查询,你应该限制结果,否则你需要更多的行insetad od =你应该使用IN – scaisEdge
谢谢Tim Biegeleisen和scaisEdge。我已经修改我的代码作为你的建议。现在我的代码工作正常,因为我expect.This将如下所示 –