【问题标题】:Query to find and join all tables in a postgres database查询以查找和连接 postgres 数据库中的所有表
【发布时间】:2021-09-24 14:59:23
【问题描述】:

我有一个独特的情况,数据库中的所有表都将具有相同的列和数据类型,但必须作为单独的表保存。

我想编写一个查询,可以找到所有这些表并将它们连接起来,最好使用一个标识源表的列。我需要它来查找所有表,而不是指定它们,因为它们会随着时间的推移而变化,并且重新编写此查询可能会很麻烦。

这可能吗?

举例说明:

database: all_data

table: red
columns: date text, value numeric, notes text

table: green
columns: date text, value numeric, notes text

... etc etc

输出将是:

source:   date:    value:    notes:
red       9/24     12        good
red       9/23     1         review
green     9/21     -1        fail
green     9/10     100       excellent

【问题讨论】:

  • 你可以看看[这里][stackoverflow.com/a/14160497/12064319]
  • 这不是“独特的情况”。这只是糟糕的应用程序设计。数据应该进入同一张表的不同分区。
  • 不,@GordonLinoff,对于这个问题来说,这不是一个可接受的解决方案,因为我们需要表级分离来消除一个不可接受的特定攻击向量,该攻击向量可能由下游进程表现出来。

标签: sql postgresql pgadmin


【解决方案1】:

您可以进行动态查询,如下所示:

您必须使用正确的 table_schema 进行过滤。

SELECT 
      regexp_replace(string_agg('SELECT ''' || table_name || ''' AS source, date, value, notes FROM ' || table_name || ' UNION ALL ', ' '), ' UNION ALL $', ';') AS "query"
FROM information_schema.tables
WHERE table_schema = 'public';

示例输出:

SELECT 'red' AS source, date, value, notes FROM red 

UNION ALL  

SELECT 'green' AS source, date, value, notes FROM green;

创建一个 PL/pgSQL 函数(这是一个例子,也许你可以改进它):

CREATE FUNCTION getAllTablesRows() RETURNS TABLE(source text, date text, value numeric, notes text) AS
$$

DECLARE

    cursorTables CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';

BEGIN

    FOR tableName IN cursorTables LOOP
        RETURN QUERY EXECUTE format('SELECT %L::text AS source, date, value, notes FROM %I', tableName.table_name, tableName.table_name);
    END LOOP;

END;

$$ LANGUAGE 'plpgsql';

调用它:

SELECT * FROM getAllTablesRows();

【讨论】:

  • 爱它。出色,干净,易于阅读,完全符合需要。后续问题:有没有办法在它形成时自动执行它?
  • 很高兴它对您有用。您可以创建一个函数(如 PL/pgSQL 函数)来执行这两个查询并返回结果集。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
相关资源
最近更新 更多