我有两个表(a,b(,或者将表连接到它自己,具有相同的列名。(这张表很宽,大约有一百列。(
使用:
SELECT a.*, b.*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
有效,但现在如果我想从中得出一个观点:
CREATE OR REPLACE VIEW v_test_ab AS
SELECT a.*, b.*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
它无法创建视图,因为会有多个列具有相同的名称。
在PostgreSQL中,有没有办法使用给定的模式自动重命名结果表的列名
例如:
CREATE OR REPLACE VIEW v_test_ab AS
SELECT a.* AS a_*, b.* AS b_*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
或者类似于:
SELECT a.* AS generate_column_names('a_%', a.*)
, b.* AS generate_column_names('b_%', b.*)
避免需要写入:
CREATE OR REPLACE VIEW v_test_ab AS
SELECT
a.id as a_id, a.date1 as a_date1, a.date2 as a_date2 -- and so on
, b.id as b_id, b.date1 as b_date1, b.date2 as b_date2 -- and so on
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;
我当然可以使用模式匹配搜索&在IDE编辑器中替换,但最终结果看起来像是臃肿的。(在我的真实世界中,有四个宽的源表,其中有许多相同的列名。(
虽然可以将创建查询包装在execute
语句中,连接目录以获取表和列名,但读取起来会很困难。
相反,最简单快捷的方法是自动构建列列表,并将其复制粘贴到查询中。
作为奖励,当有人要求重命名/更改/删除特定列时,会有一份关于其使用情况的书面记录。
SELECT table_name || '.' || column_name || ' as a_' || column_name || ', '
FROM information_schema.columns
WHERE table_schema = 'my_schema'
AND table_name= 'my_tablename';
?column?
-------------------------
my_tablename.id as a_id,
my_tablename.title as a_title,
my_tablename.a as a_a,