2010-03-23 8 views
34

Ich versuche, ein Feld in der Datenbank auf die Summe seiner verbundenen Werte zu aktualisieren:SQL Update auf die Summe seiner verbundenen Werte

UPDATE P 
SET extrasPrice = SUM(E.price) 
FROM dbo.BookingPitchExtras AS E 
INNER JOIN dbo.BookingPitches AS P ON E.pitchID = P.ID 
    AND P.bookingID = 1 
WHERE E.[required] = 1 

Wenn ich laufe dies ich folgende Fehlermeldung erhalten:

"An aggregate may not appear in the set list of an UPDATE statement." 

Irgendwelche Ideen?

+0

Was versuchen Sie zu tun? Versuchen Sie, * einige * dbo.BookingPitches-Datensätze mit einer Summe aller entsprechenden dbo.BookingPitcheExtras-Datensätze 'price'-Spalte zu aktualisieren? –

+0

Sie müssen angeben, welches Feld Sie gruppieren möchten, wenn Sie 'SUM' verwenden. – FrustratedWithFormsDesigner

+0

Diese Aussage macht keinen Sinn. Was genau versuchst du zu tun? –

Antwort

47

Wie wäre es damit:

UPDATE p 
SET extrasPrice = t.sumPrice 
FROM BookingPitches AS p 
INNER JOIN 
    (
     SELECT PitchID, SUM(Price) sumPrice 
     FROM BookingPitchExtras 
     WHERE [required] = 1 
     GROUP BY PitchID 
    ) t 
    ON t.PitchID = p.ID 
WHERE p.bookingID = 1 
+1

Ich habe diese Syntax heute als Anleitung zur Gestaltung meiner Update-Anweisung verwendet, die wie ein Zauber funktioniert. Stellen Sie als Randnotiz sicher, dass Sie die Alias-Werte genau so verwenden, wie Sie sie hier sehen. Ich tat es zunächst nicht und verbrachte eine Weile damit, mein Problem herauszufinden. –

0

eine Sub-Abfrage ähnlich Verwenden Sie zum unten.

UPDATE P 
SET extrasPrice = sub.TotalPrice from 
BookingPitches p 
inner join 
(Select PitchID, Sum(Price) TotalPrice 
    from dbo.BookingPitchExtras 
    Where [Required] = 1 
    Group by Pitchid 
) as Sub 
on p.Id = e.PitchId 
where p.BookingId = 1 
0

Sie brauchen etwas wie folgt aus:

UPDATE P 
SET ExtrasPrice = E.TotalPrice 
FROM dbo.BookingPitches AS P 
INNER JOIN (SELECT BPE.PitchID, Sum(BPE.Price) AS TotalPrice 
    FROM BookingPitchExtras AS BPE 
    WHERE BPE.[Required] = 1 
    GROUP BY BPE.PitchID) AS E ON P.ID = E.PitchID 
WHERE P.BookingID = 1 
2

Dies ist ein gültiger Fehler. Siehe this. Im Anschluss an (und andere vorgeschlagen unten) ist die Möglichkeiten, dies zu erreichen: -

UPDATE P 
SET extrasPrice = t.TotalPrice 
FROM BookingPitches AS P INNER JOIN 
(
    SELECT 
    PitchID, 
    SUM(Price) TotalPrice 
    FROM 
    BookingPitchExtras 
    GROUP BY PitchID 
) t 
ON t.PitchID = p.ID 
+0

@Ashish Gupta - Sieht sehr ähnlich wie meine Abfrage ... hmm – JonH

+0

ooops ... sorry..Wollen Sie die Antwort löschen? Ich habe die Antwort nicht geladen, als ich die Abfrage geschrieben habe und diesen Artikel gelesen habe. –

+0

Nein, das ist in Ordnung Ich dachte nur, dass es seltsam ist, dass wir sogar den gleichen temporären Speicher t verwendet haben, und die Abfrage war ziemlich genau die gleiche. 2 Antworten sind besser als 1. – JonH

5

Eine Alternative zu den oben genannten Lösungen unter Verwendung von Aliasnamen für Tabellen:

UPDATE T1 SET T1.extrasPrice = (SELECT SUM(T2.Price) FROM BookingPitchExtras T2 WHERE T2.pitchID = T1.ID) 
FROM BookingPitches T1; 
0

Ich lief in das gleiche Problem und fand, dass ich kann es mit einem Common Table Expression (erhältlich in SQL 2005 oder höher) lösen:

;with cte as (
    SELECT PitchID, SUM(Price) somePrice 
    FROM BookingPitchExtras 
    WHERE [required] = 1 
    GROUP BY PitchID) 
UPDATE p SET p.extrasPrice=cte.SomePrice 
FROM BookingPitches p INNER JOIN cte ON p.ID=cte.PitchID 
WHERE p.BookingID=1 
0

mit postgres, ich damit die Lösung einzustellen hatte für mich zu arbeiten:

UPDATE BookingPitches AS p 
SET extrasPrice = t.sumPrice 
FROM 
    (
     SELECT PitchID, SUM(Price) sumPrice 
     FROM BookingPitchExtras 
     WHERE [required] = 1 
     GROUP BY PitchID 
    ) t 
WHERE t.PitchID = p.ID AND p.bookingID = 1 
Verwandte Themen