【问题标题】:Select ALL from many postgres tables从许多 postgres 表中选择 ALL
【发布时间】:2019-10-21 09:58:37
【问题描述】:

我们有大约 40 个表,所有表都有相似但不相同的字段。每个表都有created_bycreated_at 字段。

我们正在尝试查询一组特定的表,并仅返回行 created_by = 'john' 中的 created_at 字段

到目前为止,我们已经有了

select created_at from results_tables

where <TABLE_NAME> in
(
   select table_name from information_schema.tables 
   where <some criteria to limit tables being searched>
)
and created_by = 'john'

内部查询独立工作,并列出正确的表。 我们希望外部查询从内部查询的所有表中获取created_at

所以从下表:

table1
created_by   created_at val
john         12:00      5
sue          13:20      7

table20
created_by   created_at val
john         21:30      3
jane         23:45      21

我们会得到:

12:00
21:30

【问题讨论】:

  • 你需要为此编写一个使用动态 SQL 的函数

标签: postgresql


【解决方案1】:

你可以创建一个函数来访问你所有的表:

CREATE OR REPLACE FUNCTION some_schema.some_function_name()
returns TABLE(created_by varchar(300), created_at varchar(300))
AS $BODY$
DECLARE
  stmt text;
  BEGIN
    stmt = (
        WITH relevant_tables AS (
           SELECT table_name,
                  CONCAT('SELECT created_by::varchar(300), created_at::varchar(300) FROM ', table_name) as table_query
           FROM information_schema.tables 
           WHERE <some criteria to limit tables being searched>
        )
        SELECT string_agg(table_query, ' UNION ALL ') AS final_query
        FROM relevant_tables a
    );
    return query EXECUTE stmt;
  end; $BODY$
language plpgsql
;

我不知道您的数据类型是什么,所以我将所有内容都转换为 varchar(300)

有了这个函数,你就可以调用:

SELECT * FROM some_schema.some_function_name()

你也可以添加任何你喜欢的WHERE

【讨论】:

    【解决方案2】:
    do $$
    DECLARE
    i record;
    xcreated_at text;
    
    BEGIN
    
    FOR i in  select table_name from information_schema.tables  LOOP
    
    EXECUTE('select created_at from '||i.table_name||' where created_by = ''John''')INTO xcreated_at;
    raise notice 'xcreated_at%',xcreated_at;
    END LOOP;
    END;
    
    $$  ; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-02
      • 2011-12-10
      • 1970-01-01
      • 2020-07-12
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多