使用GROUP BY在UPDATE视图上出现SQL错误

时间:2017-07-03 13:51:51

标签: sql sql-server select view

这是视图

SELECT src.OfferAngebotsnummer AS OAngNr1, 
       SUM(src.Summe2) AS Summe,  
       CSDokument_1.OfferAngebotsnummer AS OAngNr2,  
       CSDokument_1.Auftragsvolumen
FROM (
     SELECT OfferAngebotsnummer, 
            ROUND(Angebotssumme, 2) AS Summe2
     FROM dbo.CSDokument
     WHERE (MANeu = 'AS400') AND 
           (Art = '3') AND 
           (DokumentTyp = '3')) AS src 
     INNER JOIN
           dbo.CSDokument AS CSDokument_1 ON 
           src.OfferAngebotsnummer = CSDokument_1.OfferAngebotsnummer
     GROUP BY src.OfferAngebotsnummer,
                    CSDokument_1.OfferAngebotsnummer, 
                    CSDokument_1.Auftragsvolumen

这是UPDATE声明

update UpdateAuftragsvolumenAngebot
set Auftragsvolumen = Summe
where Auftragsvolumen <> Summe

但是我收到一条错误消息,表示不允许在UPDATE子句的视图上使用group by

Cannot update the view or function 'UpdateAuftragsvolumenAngebot' 
because it contains aggregates, or a DISTINCT or GROUP BY clause, 
or PIVOT or UNPIVOT operator.

如何完成UPDATE

2 个答案:

答案 0 :(得分:1)

我建议不要使用视图,只需将其移动到相关的子查询中,如下所示。我建议,因为只要您聚合视图,就无法更新基础表。

update CSDokument
set Auftragsvolumen = Summe
from CSDokument
inner join 
    (
    SELECT OfferAngebotsnummer, 
            ROUND(Angebotssumme, 2) AS Summe2
     FROM dbo.CSDokument
     WHERE (MANeu = 'AS400') AND 
           (Art = '3') AND 
           (DokumentTyp = '3')) AS src 
     INNER JOIN
           dbo.CSDokument AS CSDokument_1 ON 
           src.OfferAngebotsnummer = CSDokument_1.OfferAngebotsnummer
     GROUP BY src.OfferAngebotsnummer,
                    CSDokument_1.OfferAngebotsnummer, 
                    CSDokument_1.Auftragsvolumen
    ) as s
    on s.OfferAngebotsnummer = CSDokument.OfferAngebotsnummer
where CSDokument.Auftragsvolumen <> s.Summe

答案 1 :(得分:0)

我相信你应该在你的子查询中使用group by而不是在join阶段。