PostgreSQL中的视图错误

uz75evzq  于 2023-05-06  发布在  PostgreSQL
关注(0)|答案(5)|浏览(290)

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

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

当我将此查询作为SQL查询运行时,它将返回所需的行。
但是当我尝试使用相同的查询创建视图时,它返回一个错误:
错误:多次指定列“id”。
(我在执行查询时使用pgAdminIII。)
我猜发生这种情况是因为结果集将有多个名为“id”的列。有没有什么方法可以解决这个问题,而不需要在查询中写入所有列名?

vyswwuz2

vyswwuz21#

发生这种情况是因为视图将有两个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
o3imoua4

o3imoua42#

如果只有联接列是重复的(即有相同的名字),那么你就可以摆脱改变:

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

致:

select *
from a join b using (id)
8iwquhpp

8iwquhpp3#

对我来说,这是由于我的质量增加列。在先前版本的create view语句中有5列。我在最后的select语句中添加了3个新的列,但在create view语句开始的列列表中只添加了2个。修复列列表后,问题消失了。至于我的错误消息是没有帮助的。

0yycz8jy

0yycz8jy4#

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

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

tyky79it5#

语言中没有内置的方法来解决它(坦率地说,* 通常是一个不好的做法,因为它会导致潜在的缺陷随着表模式的变化而出现-如果你想要一个表的所有内容,并选择性地从另一个表中选择,你可以做table 1.*,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

相关问题