加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

让PostgreSQL支持没有别名的子查询(Oracle兼容)

发布时间:2020-12-13 17:10:36 所属栏目:百科 来源:网络整理
导读:PostgreSQL里我们随便运行一个不带别名的子查询: postgres=#select*from(select*frompg_class);ERROR:subqueryinFROMmusthaveanaliasLINE1:select*from(select*frompg_class);^HINT:Forexample,FROM(SELECT...)[AS]foo.postgres=# 而带子查询的是这样: pos

PostgreSQL里我们随便运行一个不带别名的子查询:

postgres=#select*from(select*frompg_class);
ERROR:subqueryinFROMmusthaveanalias
LINE1:select*from(select*frompg_class);
^
HINT:Forexample,FROM(SELECT...)[AS]foo.
postgres=#

而带子查询的是这样:

postgres=#selectamnamefrom(select*frompg_am)asalimit3;
amname
--------
btree
hash
gist
(3rows)

postgres=#

Oracle下,有无别名均可:

SQL>select*from(select*fromtab);

TNAME			TABTYPE	CLUSTERID
-----------------------------------------------
COUNTRIES		TABLE
DEPARTMENTS		TABLE
EMPLOYEES		TABLE
EMP_DETAILS_VIEW	VIEW
JOBS			TABLE
JOB_HISTORY		TABLE
LOCATIONS		TABLE
REGIONS		TABLE

8rowsselected.

SQL>

没什么大的影响,但如果遇到Oracle程序向PG迁移,改起来就有点罗嗦,这时候我们不妨让PG变化一下。

这个目标是非常明确,直接去源代码里边:grep -r "subquery in FROM must have an alias",发现它在src/backend/parser/gram.y

沿着代码往下看,可以看到子查询别名为空时报错,办法就很直截了当了,未指定别名时给他产生一个。

出错代码替换为:

Alias*a=makeNode(Alias);
a->aliasname="alias_xxxx";
n->alias=a;

编译之后运行:

template1=#selectamnamefrom(select*frompg_am)limit3;
amname
--------
btree
hash
gist
(3rows)

template1=#

小打小闹修改PG就是如此简单,当然这里还有更多工作要做,比如别名应该随机生成而不是像这样写死。

template1=#selectamnamefrom(select*frompg_am),(select*frompg_database);
ERROR:tablename"alias_xxxx"specifiedmorethanonce
template1=#

这肯定不是我们想要的结果


作为一个演示的例子,到此已经足够。


欢迎订阅国际社区中文邮件列表

欢迎使用云栖问答知识库



神州飞象(北京)数据科技有限公司,专业PostgreSQL产品与服务提供商

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读