使用 GROUP BY 的 UPDATE 视图上的 SQL 错误

Posted

技术标签:

【中文标题】使用 GROUP BY 的 UPDATE 视图上的 SQL 错误【英文标题】:SQL error on UPDATE view with GROUP BY 【发布时间】:2017-07-03 13:51:51 【问题描述】:

这是风景

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

但我收到一个错误,即不允许在视图中使用 UPDATEgroup 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

【问题讨论】:

这是因为视图的创建方式而发生的。查找原始表并更新值是最安全的方法。或者我们需要修改视图。 在上面的视图中,我将 SELECT 查询与表混合在一起。我想我现在先在表中插入查询。然后使用这两个表创建一个新视图并在此视图上运行更新。当它以这种方式工作时,我会更新我的问题。 【参考方案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

【讨论】:

感谢您的回答,但我不明白的是您说“不使用视图”而是更新“UpdateAuftragsvolumenAngebot”?此外,我在 GROUP BY 部分中遇到语法错误。是否需要先以视图以外的方式创建“UpdateAuftragsvolumenAngebot”? 是的,所以我的意思是把视图放入内部连接(这里是视图逻辑)...我稍微改变了上面的逻辑以提供更多帮助。我不确定 CSDokument 的 PK 是什么很难判断这是否会正常工作。【参考方案2】:

我认为您应该在子查询中使用 group by,而不是在加入阶段。

【讨论】:

以上是关于使用 GROUP BY 的 UPDATE 视图上的 SQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

MySQL-SQL优化:主键,order by,group by,limit,count,update

匿名块游标,包括 group by 和 for update

使用 group_by 的 MySql 视图非常慢

ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式

MySQL 进阶 索引 -- SQL优化(插入数据优化:导入本地文件数据主键优化order by优化group by优化limit优化count优化update优化)

ORA-01446 - 无法使用 DISTINCT、GROUP BY 等从视图中选择 ROWID