我正在尝试从多个表派生具有计数的表。这些表不在我的架构上。我感兴趣的模式上的表名都以“ 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
谢谢。
答案 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 '\';