2017-10-21 67 views
-1

我有一個以下查詢來更新銷售主數據庫主庫存。它在銷售表具有相同的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將如下所示 –

回答

0
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一樣按照我的期望工作。但是,我不知道這是否是更新表中特定行的特定列的正確方法來自另一個表的特定行。請引導我,我是編程新手。謝謝 –

0

你已經在另一篇文章,所以我的反應它涉及到更新更新你的答案。我會從不同的行上安排適當間隔的陳述開始,以便其他人可讀。將所有內容都放在一行上會使代碼難以調試。

例如:

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

謝謝,您的回覆對我非常有用。 –

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

不客氣! –

相關問題