使用表名中的 % 对多个表动态迭代相同的查询?

Posted

技术标签:

【中文标题】使用表名中的 % 对多个表动态迭代相同的查询?【英文标题】:Dynamically iterate the same query against multiple tables using % in table name? 【发布时间】:2021-07-05 15:56:28 【问题描述】:

我需要在 Vertica DB 中的多个表上运行此查询:

select Distinct period_key from (
select item_key,period_key,store_key,salestype,event_description_key,count(*) from 
YYYYYY.DS_AA_FACT_ZZZZZZ_TABLE_NAME
group by item_key,period_key,store_key,salestype,event_description_key
having count(*) > 1
) a

我在上述查询中使用 YYYYYY 和 ZZZZZZ 作为占位符。每个 YYYYYY 数据库名称都有多个具有不同 ZZZZZZ 名称的表。我希望能够运行一个查询并让它在符合该模式的多个表上运行此查询。

在理想情况下,此查询将返回 0 个结果。我正在检查重复(由添加一堆垃圾的错误创建,我没有这样做。)因此,如果它确实有结果,理想情况下,在它遍历所有表之后,输出看起来像 database_name , 表名, period_key, 记录数。

如果我需要在每个数据库上单独运行 YYYYYY 部分,我可以妥协,但是手动查找每个符合该模式的表名并每次更改表名非常繁琐。

如果需要,我什至可以对这些进行硬编码。虽然理想情况下我希望它能够通过查找任何具有 %%%%%%.DS_AA_FACT_%%%%%%_TABLE_NAME

的表名来进行扩展

这是在 Vertica DB 上,仅供参考。

【问题讨论】:

我对 Vertica 不是很熟悉,但看起来它们不支持动态 SQL 查询,这将使其更具挑战性。您可以使用 v_catalog.tables 获取要工作的表列表(WHERE table_name LIKE 'DS_AA_FACT_%_TABLE_NAME'),然后通过一些外部语言编写脚本。有关使用 bash 的示例,请参见此处:dwgeek.com/vertica-dynamic-sql-support-and-alternative.html 【参考方案1】:

尝试使用 SQL 生成 SQL。

就我而言,生成的查询不起作用,因为我的dbadmin 架构中没有与您需要的表结构匹配的表。但它有点传达了这个想法。

运行vsql,这是Vertica 的标准SQL 命令行工具。使用\a 不对齐输出。使用\t 只输出元组,没有页眉,没有页脚。将输出重定向到名为 doit.sql 的脚本,例如使用 \o doit.sql

当然,代替我的LIMIT 2,您可以使用table_schemaILIKE 等于table_name 的where 条件以及您提供的模式名称。

最后,运行vsql -f doit.sql

在我的演示中,我只是将初始查询的输出输出到屏幕。

\a
\t
SELECT 
  CASE ROW_NUMBER() OVER w
    WHEN 1 THEN ''
    ELSE 'UNION ALL '
  END
||'SELECT DISTINCT period_key
FROM (
  SELECT 
     item_key
   , period_key
   , store_key
   , salestype
   , event_description_key
   , count(*)
   FROM '||table_schema||'.'||table_name||'
   GROUP BY item_key
   , period_key
   , store_key
   , salestype
   , event_description_key
   HAVING count(*) > 1
) a'
FROM v_catalog.tables
WHERE table_schema='dbadmin'
WINDOW w AS (ORDER BY table_id)
LIMIT 2
;
-- out SELECT DISTINCT period_key
-- out FROM (
-- out   SELECT 
-- out      item_key
-- out    , period_key
-- out    , store_key
-- out    , salestype
-- out    , event_description_key
-- out    , count(*)
-- out    FROM dbadmin.this_is_the_new_table
-- out    GROUP BY item_key
-- out    , period_key
-- out    , store_key
-- out    , salestype
-- out    , event_description_key
-- out    HAVING count(*) > 1
-- out ) a
-- out UNION ALL SELECT DISTINCT period_key
-- out FROM (
-- out   SELECT 
-- out      item_key
-- out    , period_key
-- out    , store_key
-- out    , salestype
-- out    , event_description_key
-- out    , count(*)
-- out    FROM dbadmin.people
-- out    GROUP BY item_key
-- out    , period_key
-- out    , store_key
-- out    , salestype
-- out    , event_description_key
-- out    HAVING count(*) > 1
-- out ) a

【讨论】:

以上是关于使用表名中的 % 对多个表动态迭代相同的查询?的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 或 PL/SQL 对多个表中的列和表名进行动态查询

如何使用基于自定义参数的表名中类似于 python 的字符串格式查询谷歌数据工作室中的 bigquery 表?

通过在 Sql 中使用表名中的特定单词检查表是不是存在

从 PHP 生成 SQL 时如何处理 SQL 表名中的特殊字符?

SQL 查询 SELECT FROM [从表名中选择值]

clojure jdbc postgres:为啥我的查询结果将表名中的 unicode 字符返回为 �?