2016-06-25 12 views
-1

Ich habe eine mehrzeilige Update-Abfrage, die nicht funktioniert, wie ich es erwarte. Die JOIN Bedingung wird in der SELECT Anweisung, aber nicht in der UPDATE Anweisung eingehalten.multirow SQL-Update funktioniert nicht wie erwartet - SELECT-Ergebnis unterscheidet sich von UPDATE-Ergebnis

Mit anderen Worten: Ich änderte 1 Zeile, die SELECT Abfrage zeigt nur 1 Ergebnis (wie erwartet). Ich konvertiere die Abfrage in eine UPDATE-Anweisung und führe sie aus - alle Zeilen in der Tabelle werden auf denselben Wert geändert - die JOIN-Bedingung wird vollständig ignoriert.

Ich dachte, es war aufgrund einer Tabelle Variable, so dass ich eine temporäre Tabelle verwendet und die gleichen Ergebnisse erhalten. Ich verifizierte meine JOIN Zustand vergleicht den gleichen Datentyp (es ist ein INNER JOIN). Ich bin ratlos, warum dies nicht

SELECT 
    (o.SubTotal - o.OrderDiscounts) AS OrderSubTotal, 
    t.CommRate * (o.SubTotal - o.OrderDiscounts) AS CommDue, 
    'MODIFIED' AS "Status" 
FROM 
    bvc_Order o 
INNER JOIN 
    #tbl t ON o.OrderNumber = t.OrderNumber 

Umgerechnet auf eine UPDATE Anweisung arbeiten:

UPDATE AffiliateComm 
SET [OrderSubtotal] = (o.SubTotal - o.OrderDiscounts), 
    [CommDue] = t.CommRate * (o.SubTotal - o.OrderDiscounts), 
    [Status] = 'MODIFIED' 
FROM 
    bvc_Order o 
INNER JOIN 
    #tbl t ON o.OrderNumber = t.OrderNumber 

Ich habe getan, um die gleiche Abfrage mit einem Tabellenvariable - (wählen Werken, update aktualisiert immer alle Zeilen & ignoriert JOIN-Bedingung) keine Freude.

Fremder noch, wenn ich eine WHERE Klausel auf das Ende setzen, ist es IGNORED! Wie in

WHERE o.OrderNumber = t.OrderNumber 

Ich habe Anfragen wie diese vorher getan und nie hatte dieses Problem.

Der Ausgang der SELECT Abfrage (als Beispiel, wenn 1 Zeile geändert werden muss)

OrderSubTotal CommDue Status 
---------------------------------- 
1285.20   38.56 MODIFIED 

, wenn ich die Update-Abfrage:

(1 Zeile (n) betroffen) < - Dies ist die temporäre Tabelle (oder Variable) mit 1 Zeile eingefügt, wie es sollte Korrekt

(5 Reihe (n) betroffen) < - Dies ist die falsche Anzahl der Zeilen von der UPDATE betroffen (s hould be 1)

Gibt es eine Einstellung in SQL Server 2012, die falsch ist? Wenn Sie innerlich einer Tabelle mit einer Zeile beitreten, ist es nicht möglich, mehr als eine Zeile als Ergebnismenge zu haben, oder?

Ich bin verwirrt.

+1

Was AffiliateComm ist? Es ist nicht in einem Ihrer Beitrittskriterien. – Yobik

+0

^Ich habe nur alte Abfragen ähnlich gebaut - du hast Recht, AffiliateComm ist nicht in der Join-Bedingung (das muss das Problem sein - Herstellung von Mehrdeutigkeit), muss aber sein. Ich arrangiere das neu. – MC9000

Antwort

1

Vermutlich wollen Sie so etwas wie dieses:

UPDATE ac 
    SET [OrderSubtotal] = (o.SubTotal - o.OrderDiscounts), 
     [CommDue] = t.CommRate*(o.SubTotal - o.OrderDiscounts), 
     [Status] = 'MODIFIED' 
FROM AffiliateComm ac INNER JOIN 
    bvc_Order o 
    ON ac.OrderNumber = o.OrderNumber INNER JOIN 
    #tbl t 
    ON o.OrderNumber = t.OrderNumber ; 

Mit anderen Worten, AffiliateComm in den anderen Tabellen verknüpft werden muss, irgendwie. Ansonsten werden alle Zeilen in AffiliateComm aktualisiert, glaube ich mit dem gleichen Wert. Ich habe eine AffiliateId für die obige Abfrage gebildet.

+0

Ich bin ein Space Cadet! Ich habe die Join-Bedingung folgendermaßen geändert - es funktioniert jetzt. \t \t VON bvc_Order o INNER JOIN AffiliateComm ac ON ac.OrderNumber = o.OrderNumber \t \t INNER JOIN #tbl t ON t.OrderNumber = ac.OrderNumber – MC9000

1

In Ihrem Update:

UPDATE AffiliateComm 
    SET [OrderSubtotal]=(o.SubTotal - o.OrderDiscounts), [CommDue]=t.CommRate*(o.SubTotal - o.OrderDiscounts),[Status]='MODIFIED' 
    FROM bvc_Order o 
    INNER JOIN #tbl t 
     ON o.OrderNumber = t.OrderNumber 

Sie sagen, SQL Server eine Tabelle AffiliateComm genannt zu aktualisieren. Diese Tabelle ist jedoch nicht in Ihrem Join enthalten.

Nicht das Schema dieser Tabelle zu kennen, kann ich nur an whata richtig erraten, vielleicht so etwas wie:

UPDATE a 
    SET [OrderSubtotal]=(o.SubTotal - o.OrderDiscounts), [CommDue]=t.CommRate*(o.SubTotal - o.OrderDiscounts),[Status]='MODIFIED' 
    FROM AffiliateComm A 
    INNER JOIN bvc_Order o 
     ON o.OrderNumber = a.OrderNumber 
    INNER JOIN #tbl t 
     ON o.OrderNumber = t.OrderNumbe