参见postgrsql开发组邮件列表:
https://www.postgresql.org/message-id/flat/1487773980.3143.15.camel@oopsware.de
目前版本包括15的beta版本,必须使用别名:
postgres=# SELECT * FROM (SELECT * FROM accounts);
ERROR: subquery in FROM must have an alias
LINE 1: SELECT * FROM (SELECT * FROM accounts);
^
HINT: For example, FROM (SELECT ...) [AS] foo.
postgres=# SELECT * FROM (SELECT * FROM accounts) as foo;
id | number | client | amount
----+--------+--------+-----------
3 | 2002 | bob | 10.00
4 | a | a | 13
2 | 2001 | bob | 1120.0000
1 | 2000 | alice | 800
(4 rows)
因为在oracle中是可以不需要写别名的,所以从oracle迁移至postgresql会觉的让人不爽,但是从16版本开始,from子句的别名可以省略不写了。
可以查看Postgresql的源码,源码也说明了SQL规范不允许没有ALIAS子句的子选择,所以Postgres也不允许,可查阅:
https://github.com/postgres/postgres/blob/REL_15_STABLE/src/backend/parser/gram.y#L13350
16开发者版本from子查询在没有别名的情况下可以正常执行,如下:
psql (16devel)
Type "help" for help.
postgres=# CREATE TABLE test(id int);
CREATE TABLE
postgres=# SELECT * FROM (SELECT * FROM test);
id
----
(0 rows)
希望能看到16版本最终提交该补丁吧。
参考:
https://pganalyze.com/blog/5mins-postgres-waiting-for-postgres-16-subquery-alias-optional