`PostgreSQL 中视图的列“...”指定多次`错误

问题描述 投票:0回答:6

我在 PostgreSQL 数据库中有一个大型查询。 查询是这样的:

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...

当我将此查询作为 SQL 查询运行时,它返回所需的行。

但是当我尝试使用相同的查询来创建视图时,它返回一个错误:

错误:多次指定列“id”。

(执行查询时我使用 pgAdminIII。)

我猜会发生这种情况,因为结果集将有多个名为“id”的列。有没有办法解决这个问题,而不需要在查询中写入所有列名?

sql database postgresql pgadmin sql-view
6个回答
29
投票

发生这种情况是因为视图将有两个 id 命名列,一个来自 table1,一个来自 table2,因为 select *。

您需要在视图中指定您想要的 id。

SELECT table1.id, column2, column3, ... FROM table1, table2 
WHERE table1.id = table2.id

查询有效,因为它可以具有相同名称的列...

postgres=# select 1 as a, 2 as a;
 a | a
---+---
 1 | 2
(1 row)

postgres=# create view foobar as select 1 as a, 2 as a;
ERROR:  column "a" duplicated
postgres=# create view foobar as select 1 as a, 2 as b;
CREATE VIEW

17
投票

如果只有连接列重复(即具有相同的名称),那么您可以进行更改:

select *
from a, b
where a.id = b.id

至:

select *
from a join b using (id)

0
投票

对我来说,这是由于我大量添加列而发生的。 之前版本的create view语句有5列。 我在最终选择中添加了 3 个新列,但在创建视图语句开头的列列表中仅添加了 2 个。 修复列列表后,问题就消失了。 对于我来说错误消息没有帮助。


0
投票

我在下面遇到了同样的错误:

错误:列“?列?”多次指定

当我尝试使用

SELECT 语句
创建具有 2 列
'Hello'
'World' 的视图时,如下所示:

CREATE VIEW my_view AS
  SELECT 'Hello', 'World';

所以,我使用了VALUES语句,然后我就可以创建没有错误的视图,如下所示:

CREATE VIEW my_view AS
  -- SELECT 'Hello', 'World';
  VALUES ('Hello', 'World');

此外,如果您尝试使用

SELECT 语句
创建具有一列('Hello', 'World')的视图,如下所示:

CREATE VIEW my_view AS
  SELECT ('Hello', 'World');

然后出现如下错误:

错误:列“行”有伪类型记录


-1
投票

如果您来到这里是因为您尝试使用像

to_date
这样的函数并收到“定义多次”错误,请注意您需要为函数使用列别名,例如:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date

-3
投票

语言中没有内置的方法来解决这个问题(坦率地说,* 通常是一种不好的做法,因为它可能会导致随着表模式更改而出现潜在的缺陷 - 您可以执行 table1.*、table2.acolumn、tabl2.* 等操作。 bcolumn(如果您想要一个表的所有内容并选择性地从另一个表中获取),但如果 PostgreSQL 支持 INFORMATION_SCHEMA,您可以执行以下操作:

DECLARE @sql AS varchar

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']'
    + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION

PRINT @sql

并将结果粘贴进去以节省大量打字。当然,您需要手动为具有相同名称的列添加别名。如果您愿意,您也可以代码生成唯一的名称(但我不喜欢):

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] '
    + 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']'
    + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION
© www.soinside.com 2019 - 2024. All rights reserved.