2017-10-21 3 views
-1

Ich habe eine folgende Abfrage, um den verfügbaren Bestand des Produktbestandsstamms vom Verkaufsstamm zu aktualisieren. Es zeigt einen Fehler an, wenn die Verkaufstabelle denselben prd_code hat. Ich verwende Rechnungsnr für eine Bedingung, aber es nimmt alle Datensätze aus Sales-Master. Meine INVOICE_NO Bedingung funktioniert hier nicht.Unterabfrage hat mehr als 1 Wert zurückgegeben. Dies ist nicht zulässig, wenn die Unterabfrage folgt =,! =, <, <= , >,> = in 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

Die Unterabfrage gibt mehr als einen Wert an einer Stelle in Ihrer Abfrage zurück, wo dies keinen Sinn ergibt. Die Fehlermeldung kann nicht klarer sein. –

+0

Ihre Unterabfrage gibt mehr als 1 Zeile zurück. Wenn Sie also nur einen Zeilen-Subselect benötigen, sollten Sie das Ergebnis begrenzen, ansonsten brauchen Sie mehr Zeilen. Insetad od = Sie sollten IN verwenden – scaisEdge

+0

Danke Tim Biegeleisen und scaisEdge. Ich habe meinen Code als Ihr Vorschlag geändert. Jetzt funktioniert mein Code gut, wie ich erwartet habe. Das sieht wie folgt aus –

Antwort

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

Ich änderte meinen Code wie this.it arbeitet als meine Erwartung. Aber ich weiß nicht darüber, ob es eine korrekte Weise ist, bestimmte Spalten bestimmter Zeilen in einer Tabelle zu aktualisieren aus den spezifischen Zeilen einer anderen Tabelle. Bitte, führen Sie mich, ich bin neu in der Programmierung. Danke –

0

Sie haben Ihre Antwort in einem anderen Beitrag aktualisiert, so meine Antwort es zu diesem Update bezogen. Ich würde damit beginnen, Anweisungen auf verschiedenen Zeilen mit einem angemessenen Abstand zu arrangieren, damit sie für andere lesbar sind. Alles auf einer Zeile zu haben macht den Code schwierig zu debuggen.

Zum Beispiel:

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 

Was ich daraus gelesen werden Sie aktualisieren 2 Felder. Im ersten Update aktualisieren Sie SOLD_STOCK. Wenn eine Zeile WHERE SALES_D_ORG.PRD_CODE = PRD_STOCK.PRD_CODE and SALES_D_ORG.INVOICE_NO = 1 vorhanden ist, aktualisieren Sie das Feld mit der sum(SALES_D_ORG.QTY) WHERE SALES_D_ORG.PRD_CODE = PRD_STOCK.PRD_CODE. Ich sehe nichts falsch mit dem Code. Es liegt an Ihnen zu entscheiden, ob die Logik hinter dem Update korrekt ist. Ähnlich sehe ich nichts falsch mit dem 2. Update. Es liegt an Ihnen als Coder, festzustellen, ob Ihre Logik für die Anwendung des Updates korrekt ist.

+0

Vielen Dank, Ihre Antwort ist sehr nützlich für mich. –

0

Ich denke, Sie brauchen keine While-Schleife oder mehrere Unterabfragen. Dieses Skript hat den gleichen Job gemacht.

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

Ja, ich habe meine Abfrage geändert. Jetzt verwende ich keine while-Schleife. Vielen Dank für Ihre wertvolle Antwort. –

+0

Gern geschehen! –

Verwandte Themen