首页 > 解决方案 > 使用表名中的 % 对多个表动态迭代相同的查询?

问题描述

我需要在 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 上仅供参考。

标签: sqlsql-serverselectvertica

解决方案


尝试使用 SQL 生成 SQL。

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

Run vsql,Vertica 的标准 SQL 命令行工具。用于\a不对齐输出。仅用于\t输出元组,无页眉,无页脚。将输出重定向到名为的脚本,例如doit.sql- 使用\o doit.sql,例如。

当然,代替 my LIMIT 2,您将使用 where 条件与您提供的模式名称相等table_schemaILIKEof 。table_name

最后,运行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

推荐阅读