我正在尝试通过连接两个表来创建视图。这两个表有几个同名的列。这给出了一个错误
SQL 错误 [42701]:错误:多次指定列“column_name”
我不能在创建视图时使用列名,因为有 30 多个列,并且在一段时间内将向两个表中添加新列。因此,我必须使用 * 来获取所有列。
现在,为了消除两个表中都存在的列,我继续这样做:
SELECT 'SELECT ' || STRING_AGG('u2.' || column_name, ', ') || ' FROM schema_name.table_name u2'
FROM information_schema.columns
WHERE table_name = 'table_name'
AND table_schema = 'schema_name'
AND column_name NOT IN ('column_name');
这为我提供了从schema_name.table_name
没有列 column_name 的情况下选择数据的查询。太棒了!!
问题:如何执行上述查询的结果?
我试过PREPARE
语句,它只是执行上面的查询,而不是上面查询的结果。
此外,创建一个没有列“column_name”的临时表不是一个可行的解决方案。
您需要准备一个动态查询,然后EXECUTE
它。它会是这样的:
DO
$do$
BEGIN
EXECUTE (
SELECT CONCAT('CREATE VIEW temp_view AS SELECT ',
-- SELECT table1 columns here
(SELECT STRING_AGG('u1.' || column_name, ', ')
FROM information_schema.columns
WHERE table_name = 'table1'
AND table_schema = 'schema_name'
-- AND column_name NOT IN ('column_name') -- not omitting for table1
),
', ',
-- SELECT table2 columns here
(SELECT STRING_AGG('u2.' || column_name, ', ')
FROM information_schema.columns
WHERE table_name = 'table2'
AND table_schema = 'schema_name'
AND column_name NOT IN ('column_name')),
-- Dynamically prepare the FROM and JOIN clauses
' FROM table1 u1 JOIN table2 u2 ON u1.id = u2.table1_id'));
END
$do$;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句