Postgres 不能用视图模拟表:列必须出现在 GROUP BY 子句中或在聚合函数中使用

Dan*_*Man 4 postgresql view

我正在尝试使用视图替换我们应用程序中的表。它在大多数情况下运行良好,但我无法克服这个错误:“列必须出现在 GROUP BY 子句中或用于聚合函数中”

重现步骤:

CREATE TABLE example_t (
    did serial PRIMARY KEY,
    a text,
    b text
);
INSERT INTO example_t(a, b) VALUES ('a', 'b');

CREATE VIEW example_t_v AS 
    SELECT t.did as did, t.a as a, t.b as b
    FROM example_t t;
Run Code Online (Sandbox Code Playgroud)

现在这个查询工作正常:

SELECT t.a, t.b FROM example_t t GROUP BY (t.did);
Run Code Online (Sandbox Code Playgroud)

但是来自视图的相同查询失败:

SELECT t.a, t.b FROM example_t_v t GROUP BY (t.did);

ERROR:  column "t.a" must appear in the GROUP BY clause or be used in an aggregate function
LINE 1:   SELECT t.a, t.b FROM example_t_v t GROUP BY (t.did);
Run Code Online (Sandbox Code Playgroud)

重写应用层会非常困难(因为 Django 正在生成查询并且它喜欢使用GROUP BY很多)那么 db 层有解决方案吗?

Joi*_*dio 8

Postgres 足够聪明,可以知道TABLE您的分组列是UNIQUE( PRIMARY KEY) ...按UNIQUE毫无意义的列分组,因此 postgres 只会给您返回您要求的内容(列值 a 和 b)。

但是,Postgres 不知道 group-by 列VIEWUNIQUE.. 因此,它会被您的查询混淆(以及大多数人会被您的查询混淆 - 包括我自己)。

仅供参考 - 您的查询毫无意义。当您显然对执行聚合不感兴趣时​​,为什么要按列分组?你希望 a 和 b 给你什么?