Postgresql

列必須出現在 GROUP BY 子句中或在聚合函式中使用

  • June 29, 2018

我有一個包含 col1、col2、col3 列的簡單表。都不能為空。

我想刪除元組 (col1, col2) 有多個條目的所有行。背景:應添加 (col1, col2) 的唯一約束。

drop table mytable;

create table mytable (
   col1 integer not null,
   col2 integer not null,
   col3 integer not null);

-- rows to delete
insert into mytable values (1, 1, 1);
insert into mytable values (1, 1, 2);

-- rows to keep
insert into mytable values (2, 2, 1);
insert into mytable values (2, 3, 2);



delete from mytable where 
(col1, col2) in  (
   select col1, col2 from mytable  
   group by (col1, col2) having  count(distinct col3) >1) ;

select * from mytable;

以上適用於 PostgreSQL 10,但在舊版本上失敗。

舊版本告訴我這個錯誤資訊:

錯誤:列“mytable.col1”必須出現在 GROUP BY 子句中或在聚合函式中使用

如何讓它在 PG 9.3 上執行?

您只需要刪除group by (col1, col2). 這也適用於 9.4 版及之前的版本:

delete from mytable  
where (col1, col2) in  (
   select col1, col2 from mytable  
   group by col1, col2                   -- <-- changed
   having  count(distinct col3) >1) ;

它失敗的原因(我認為)是雖然(col1, col2)相當於row(col1, col2),但在 9.5 中修復的各種條款中處理它的方式存在一些不一致。WHERE在以前的版本中,您可以在:中使用更複雜的構造WHERE (SELECT (col1, col2)) IN ...。所以這也應該在 9.3 中工作:

delete from mytable
where (select (col1, col2)) in  (
   select (col1, col2) from mytable  
   group by (col1, col2) having  count(distinct col3) >1) ;

引用自:https://dba.stackexchange.com/questions/202988