PostgreSQL:物化视图连接含同名列的表报错如何解决?
解决物化视图RIGHT JOIN时重复列报错的问题
问题根源
你执行普通SELECT *查询时,即便两张表包含同名的racedate、racename、racetime列,查询能正常运行,但创建物化视图时要求所有列名必须唯一,重复的列名会触发Spalte »racetime« mehrmals angegeben(列racetime多次指定)的报错。
可行解决方案
方案1:明确指定所需列,规避重复
放弃SELECT *,手动列出需要的所有列,对重复的连接列只保留一份(或按需选择某张表的)。示例:
CREATE MATERIALIZED VIEW allracesview AS SELECT -- 保留 races 表的连接列,也可根据需求选择 horses 表的 r.racedate, r.racename, r.racetime, -- 列出 horses 表的其他字段 h.horse_id, h.horse_name, h.jockey, -- 列出 races 表的其他字段 r.race_id, r.track, r.prize_money FROM horses h RIGHT JOIN races r ON h.racedate = r.racedate AND h.racename = r.racename AND h.racetime = r.racetime ORDER BY r.racedate, r.racetime DESC;
方案2:用USING子句简化连接,自动去重重复列
由于你的连接条件是两张表的同名列,改用USING替代ON后,SELECT *会自动只保留一份连接列,避免重复。示例:
CREATE MATERIALIZED VIEW allracesview AS SELECT * FROM horses h RIGHT JOIN races r USING (racedate, racename, racetime) ORDER BY r.racedate, r.racetime DESC;
方案3:给重复列重命名(如需保留双份)
如果确实需要保留两张表的重复列(比如字段含义有差异),可以为它们重命名区分。示例(适用于PostgreSQL 12+):
CREATE MATERIALIZED VIEW allracesview AS SELECT h.racedate AS horse_racedate, h.racename AS horse_racename, h.racetime AS horse_racetime, r.racedate AS race_racedate, r.racename AS race_racename, r.racetime AS race_racetime, -- 导入两张表的其他非重复列 h.* EXCEPT (racedate, racename, racetime), r.* EXCEPT (racedate, racename, racetime) FROM horses h RIGHT JOIN races r ON h.racedate = r.racedate AND h.racename = r.racename AND h.racetime = r.racetime ORDER BY r.racedate, r.racetime DESC;
低版本PostgreSQL不支持EXCEPT语法,需手动列出其他非重复列。
内容的提问来源于stack exchange,提问作者Jay Jericho
相关产品推荐
相关产品推荐

