查看PostgreSQL中的错误

时间:2008-10-16 09:48:43

标签: sql postgresql pgadmin

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

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

当我以sql查询运行此查询时,它返回所需的行。

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

“error:column”id“指定了多次。”

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

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

4 个答案:

答案 0 :(得分:14)

这是因为视图会有两个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

答案 1 :(得分:13)

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

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

为:

select *
from a join b using (id)

答案 2 :(得分:0)

如果你到这里是因为你试图使用像to_date这样的函数并且得到“定义不止一次”的错误,请注意你需要为函数使用列别名,例如:

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

答案 3 :(得分:-2)

语言中没有内置的解决方法(坦率地说,*一般来说是一种不好的做法,因为随着表格模式的改变,它会导致潜在的缺陷 - 你可以做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