我有两个表,AB,它们有不同的列,其中一些列同名.

CREATE TABLE A (
    id serial PRIMARY KEY,
    col_a int,
    col_b int,
    col_c int
);

CREATE TABLE A (
    id serial PRIMARY KEY,
    col_a int,
    col_b int,
    col_e int
);

我想加入col_a的两个表,如下所示:

select * from A a join B b USING(col_a)

最终,我想从这个查询create view my_view as (...)创建一个视图.但是当我这样做时,我得到一个错误,因为列idcol_b出现了两次.有没有办法在联接时将前缀/后缀添加到表B的列中,从而不会出现名称冲突?

编辑

为了清楚起见,我不想使用别名,因为实际上我的表有O(50)列,而我想使用通配符*.如果您使用别名,这肯定是一个解决的问题,但特别是在我的例子中,我正在创建视图的视图,我希望语法糖能使它变得更简单.

推荐答案

您可以在视图中使用composite values,即将视图定义为有两列,一列的值为A,另一列的值为B:

CREATE VIEW my_view AS SELECT a, b from A a join B b USING (col_a);

然而,对于use in queries人来说,它们有点难看,总是需要括号来消除field selection expressions的歧义:

SELECT (v.a).col_a, (v.a).id AS a_id, (v.b).id AS b_id FROM my_view v;
SELECT (a).col_a, (a).id AS a_id, (b).id AS b_id FROM my_view;

(online demo)

这是最接近"前缀"的地方,尽管它可以在视图定义中自动生成.一旦定义了视图的视图,您仍然应该(显式地)命名基础表,但不能进一步嵌套复合类型.

Postgresql相关问答推荐

如何使用Docker安装PostgreSQL扩展

转换失败:(—122.763091,49.04676)转换为地理(位置)""

在Haskell中定义新类型与持久化类型的惯用方法

DBT-DBT依赖于未找到的源

如何在PostgreSQL中 Select 最近30天内的开始日期?

在插入时创建一个触发器,在PostgreSQL中的另一个表上创建另一个触发器

PostgreSQL 中的 Datum 数据类型是什么以及它的用途是什么?

Npgsql中准备好的语句和参数化查询有什么区别?

未更改表上的 Postgres 环绕预防

如何通过 DirectFunctionCall 发送 NULL 参数?

在 SQL 上返回负值

Spring:如何在 PostgreSQL 中使用 KeyHolder

postgreSQL 中对 utf-8 的 LC_COLLATE 和 LC_CTYPE 支持

在 PostgreSQL 中将时间转换为秒

全文的 Postgresql 前缀通配符

Array Push的 Postgres 数组追加和数组长度

PostgreSQL:如果不存在则创建表 AS

在布尔字段上添加索引

如何在 postgresql 中获取整个表的哈希?

在 OS X 上使用 Postgres.app 时如何将 psql 放在路径上?