【问题标题】:How to execute result of a query in PostgreSQL如何在 PostgreSQL 中执行查询结果
【发布时间】:2021-04-23 15:23:05
【问题描述】:

我正在尝试通过连接两个表来创建视图。这两个表有几个同名的列。这给出了一个错误

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”列的临时表不是一个可行的解决方案。

【问题讨论】:

  • psql 中,您可以使用\gexec 元命令运行它。
  • @a_horse_with_no_name,在执行完这个查询后,我必须将结果与另一个表连接起来创建一个视图
  • 你需要使用 PL/pgSQL 和dynamic SQL
  • @TridevChaudhary 检查我的答案。我还在回答中提供了一个 db fiddle (DEMO)。您可能需要根据您的表名修改查询。

标签: sql postgresql


【解决方案1】:

你需要准备一个动态查询然后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$;

CHECK DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2019-10-07
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多