sql - 使用表名中的 % 对多个表动态迭代相同的查询?
问题描述
我需要在 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 生成 SQL。
就我而言,生成的查询不起作用,因为我的dbadmin
架构中没有与您需要的表结构匹配的表。但它有点传达了这个想法。
Run vsql
,Vertica 的标准 SQL 命令行工具。用于\a
不对齐输出。仅用于\t
输出元组,无页眉,无页脚。将输出重定向到名为的脚本,例如doit.sql
- 使用\o doit.sql
,例如。
当然,代替 my LIMIT 2
,您将使用 where 条件与您提供的模式名称相等table_schema
和ILIKE
of 。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
推荐阅读
- php - 添加到数组中的数组(构建数据组)
- ruby-on-rails - PSQL 连接问题
- plot - Matlab/Octave - 解析和绘制日期字符串与整数
- javascript - Adding a skip button to my gif preloader for a website
- python - 将所有文件从目录树移动到另一个目录。重命名,如果重复名称
- angularjs - AngularJs waith before dom content loaded
- unity3d - 替换animator组件上的头像好像不是在换头像?
- r - R 降价。.csv 表格的 Pdf 输出。创建包含列总计的行的问题
- php - 使用 PHP 从 mysql 数据库检查时间
- vb.net - 使用 VB.net 更新数据库(Microsoft Access)