2013-02-06 13 views
16
UPDATE [asgdb01].[dbo].[info] 
SET [FM] = SUM(a.[PAZARTESI] - b.[KOTA]) 
FROM [asgdb01].[dbo].[info] a, [asgdb01].[dbo].[kota] b 
WHERE a.[WORK_TYPE]='IN' AND a.[NAME]='ALP' 

Gdy uruchomię to pojawia się następujący błąd:Agregat może nie pojawić się na liście SET instrukcji UPDATE

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

jakieś pomysły?

+2

Czy rzeczywiście chcesz zrobić ten produkt kartezjański ?. Co używasz RDBMS? – Lamak

+0

Używam mssql i chcę odjąć między pazartesi i kota, który pochodzi z różnych tabel. –

+2

Rozumiem, że chcesz użyć dwóch różnych tabel, ale czy wiesz, że nie używasz między nimi warunku "JOIN", co skutkuje produktem kartezjańskim? – Lamak

Odpowiedz

27

Zgaduję, że (jak inni zauważyli) tak naprawdę nie chcesz kartezjańczyka na tej aktualizacji, więc dodałem do zapytania "identyfikator", więc będziesz musiał dokonać pewnych modyfikacji, ale to może ci pomóc na prawej ścieżce

;with temp as (
    select a.id, SUM(a.pazartesi - b.kota) as newTotal 
    from [asgdb01].[dbo].[info] a join [asgdb01].[dbo].[kota] b 
      on a.id = b.id 
    where a.work_type='in' and a.name='alp') 
update a 
set  fm = t.newTotal 
from [asgdb01].[dbo].[info] a join temp t on a.id = t.id 
+0

Musiałem pogrupować według identyfikatora w temp, aby działało z użyciem licznika zamiast sumy. Fantastyczna odpowiedź. –

+0

+1 [CTE] (https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql) jest eleganckim i dobrym rozwiązaniem wydajnościowym w przeciwieństwie do [liczne] (https://stackoverflow.com/questions/25937315/) inne sposoby, które używają podkwerend "CROSS" lub wbudowanych. – dakab

Powiązane problemy