在PostgreSQL中查看错误

26

我在一个PostgreSQL数据库中有一个大查询。 查询大致如下:

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

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

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

"error: column "id" specified more than once."

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

我猜这是因为结果集将有多个名为"id"的列。是否有某种方法可以解决此问题,而不必在查询中编写所有列名?

5个回答

29

这是因为一个视图中会有两个名为columns的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

16
在SELECT *查询结果中,有没有一种自动将表名前缀添加到列名的方法? - nnyby
2
这个解决方案的问题在于当你有太多列需要手动写入你的选择语句时。 - fccoelho

17

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

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

to:

select *
from a join b using (id)

4
这并没有修复错误,但语法更好了。 - Ilya Kogan

0

对我来说,这是由于我在添加列时出现了错误。 在以前的create view语句中有5列。 我在最终选择中添加了3个新列,但只在create view语句的开头添加了2个列。 修正列清单后,问题消失了。 对我来说,错误消息没有帮助。


-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

PostgreSQL 中没有类似 @SOMETHING 的东西。 - user80168
也不能使用[]来引用标识符。也没有CHAR()函数。也没有PRINT语句。 - Magnus Hagander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接