如何循环从多个表中获取计数?

时间:2019-02-06 15:49:38

标签: sql oracle

我正在尝试从多个表派生具有计数的表。这些表不在我的架构上。我感兴趣的模式上的表名都以“ STAF_”开头,以“ _TS”结尾。我正在寻找的标准是SEP ='MO'。因此,例如,查询的基本形式为:

select area, count(SEP) areacount
from mous.STAF_0001_TS
where SEP = 'MO'
group by area;

我想为此做大约1000张桌子。

最终,我希望输出为我的架构上的表格,如下所示:

 area| areacount
 0001|  3
 0002|  7
 0003|  438

谢谢。

2 个答案:

答案 0 :(得分:1)

第一步,我将编写一个SQL查询,该查询将生成一个SQL查询:

SELECT 'SELECT area, count(*) FROM '||c.table_name||'UNION ALL' as run_me
FROM all_tables c
WHERE c.table_name LIKE 'STAF\_%\_MS' escape '\'

运行此命令将产生另一个SQL查询的输出。将结果文本复制到结果网格之外,然后将其粘贴回查询窗格中。删除最终的UNION ALL并运行

一旦您研究了如何编写生成SQL查询的SQL查询,就可以将其变成视图,或在字符串中创建动态查询。

必须说,这是一种可怕的存储数据的方式。您最好将ONE表与包含当前STAF_xxx_MS xxx中任何内容的额外列一起使用

答案 1 :(得分:0)

在Oracle 12c中,您可以嵌入FUNCTION来查询任何给定表中的行数。然后,您可以在主查询中使用该功能。这是一个示例:

WITH FUNCTION cnt ( p_owner VARCHAR2, p_table_name VARCHAR2 ) RETURN NUMBER IS
  l_cnt NUMBER;
BEGIN
  EXECUTE IMMEDIATE 'SELECT count(*) INTO :cnt FROM ' || p_owner || '.' || p_table_name INTO l_cnt;
  RETURN l_cnt;
EXCEPTION WHEN OTHERS THEN 
  RETURN NULL;  -- This will happen for entries in ALL_TABLES that are not directly accessible (e.g., IOT overflow tables)
END cnt;
SELECT t.owner, t.table_name, cnt(t.owner, t.table_name)
FROM all_tables t
where t.table_Name like 'STAF\_%\_MS' escape '\';