Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在多个表上构造动态查询_Sql_Postgresql_Dynamic Sql - Fatal编程技术网

Sql 如何在多个表上构造动态查询

Sql 如何在多个表上构造动态查询,sql,postgresql,dynamic-sql,Sql,Postgresql,Dynamic Sql,我不知道该如何表述这个查询。我想我需要一个子查询?下面是我在一个查询中要做的基本内容 此查询为我提供了所需的表列表: SELECT table_name FROM information_schema.tables WHERE table_schema = 'abc_dev_12345' AND table_name like 'fact_%'; 对于给定的表列表,我想对每个表的名称进行计数(每个表的名称都有我需要查询的相同列信息) 我可以遍历第一个查询中列出的每个表进行计数吗? 在单个

我不知道该如何表述这个查询。我想我需要一个子查询?下面是我在一个查询中要做的基本内容

此查询为我提供了所需的表列表:

SELECT table_name 
FROM information_schema.tables 
WHERE table_schema = 'abc_dev_12345' 
AND table_name like 'fact_%';
对于给定的表列表,我想对每个表的名称进行计数(每个表的名称都有我需要查询的相同列信息)

我可以遍历第一个查询中列出的每个表进行计数吗? 在单个查询中执行此操作

因此,预期结果与此类似:

table_name |  key_count | domain_key | form_created_datetime
--------------------------------------------------------------
fact_1        1241                 5   2015-09-22 01:47:36.136789
fact_2          32                 9   2015-09-22 01:47:36.136789
示例数据:

abc_dev_12345=> SELECT *
FROM information_schema.tables
where table_schema='abc_dev_own_12345'
and table_name='fact_1';
 table_catalog |   table_schema    |     table_name     | table_type | self_referencing_column_name | reference_generation | user_defined_type_catalog | user_defined_type_schema | use
r_defined_type_name | is_insertable_into | is_typed | commit_action
---------------+-------------------+--------------------+------------+------------------------------+----------------------+---------------------------+--------------------------+----
--------------------+--------------------+----------+---------------
 abc_dev_12345 | abc_dev_own_12345 | fact_1 | BASE TABLE |                              |                      |                           |                          |
                    | YES                | NO       |
(1 row)


abc_dev_12345=> SELECT column_name
FROM information_schema.columns
WHERE table_schema = 'abc_dev_own_12345'
  AND table_name   = 'fact_1';
      column_name
------------------------
 email_date_key
 email_time_key
 customer_key
 form_created_datetime
 client_key
 domain_key

正如Eelke和Craig Ringer所指出的,您需要在
plpgsql
函数中进行动态查询。要应用于每个表的基本语句是:

SELECT <table_name>, count(domain_key) AS key_count, domain_key, form_created_datetime
FROM <table_name> GROUP BY 3, 4
不需要如此高效的循环或游标

像使用任何其他表格一样使用:

SELECT * FROM table_domains();

information\u schema.tables是否具有列domain\u键和表单\u created\u datetime?你能从你的表列表中提供一些示例数据以及你想要的其他列值吗?我想我也可以查询这些表的列名信息?对不起,我不知道postgresql。但是,如果您可以显示与所需输出匹配的information_schema.tables中的一些数据,我可以帮助您完成query.added查询information_schema(表、列)的输出。是否对信息_schema中的表、列进行联接?@noober我认为没有办法将其作为单个查询,因为我不相信有办法在from变量中生成表。但是,您可以编写一个plpgsql函数或代码块,该函数或代码块迭代第一个查询中的表列表,并根据该结果动态生成和执行查询。感谢您的帮助。我现在正在尝试创建函数,但是得到了这个。不确定其来源:
psql:crTestFunction.sql:20:ERROR:syntax ERROR位于或靠近“qry”行18:returnquery qry尝试
返回查询执行
CREATE FUNCTION table_domains()
RETURNS TABLE (table_name varchar, key_count bigint, domain_key integer, form_created_datetime timestamp)
AS $$
DECLARE
  qry text;
BEGIN
  -- format() builds query for individual table
  -- string_agg() UNIONs queries from all tables into a single statement
  SELECT string_agg(
    format('SELECT %1$I, count(domain_key), domain_key, form_created_datetime
            FROM %1$I GROUP BY 3, 4', table_name),
    ' UNION ') INTO qry
  FROM information_schema.tables 
  WHERE table_schema = 'abc_dev_12345' 
    AND table_name LIKE 'fact_%';

  -- Now EXECUTE the query
  RETURN QUERY EXECUTE qry;
END;
$$ LANGAUGE plpgsql;
SELECT * FROM table_domains();