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

问题描述 投票:0回答:1

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

sql select vertica
1个回答
0
投票

尝试使用 SQL 生成 SQL。

在我的例子中,生成的查询将不起作用,因为我的

dbadmin
模式中没有与您需要的表结构匹配的表。但它传达了这样的想法。

运行

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

当然,您可以使用 where 条件来确定

LIMIT 2
table_schema
ILIKE
是否相等以及您提供的模式名称,而不是我的
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
© www.soinside.com 2019 - 2024. All rights reserved.