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();