使用 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
但我收到一个错误,即不允许在视图中使用 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
?
【问题讨论】:
这是因为视图的创建方式而发生的。查找原始表并更新值是最安全的方法。或者我们需要修改视图。 在上面的视图中,我将 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
ORA-00979: 在使用子查询查询视图时不是 GROUP BY 表达式
MySQL 进阶 索引 -- SQL优化(插入数据优化:导入本地文件数据主键优化order by优化group by优化limit优化count优化update优化)