一次查询多个相似表

one query for many similar tables

我有一个 Oracle 数据库,其中有许多 table 具有相同的结构(列都相同)。 table 名称也相似。 table 的名称如 table_1、table_2、table_3...

我知道这不是最有效的设计,但我目前无法更改它。

在这种情况下,是否可以进行单个 sql 查询,在多个 tables(数百个 tables)中提取具有相同条件的所有行,而无需明确使用确切的 table 名称?

我意识到我可以使用类似 select * 来自 table_1 UNION select * 来自 table_2 UNION select * 来自 table_3...select * 来自 table_1000

但是有没有更优雅的 sql 语句可以 运行 从所有匹配的 table 名称中提取到一个结果中,而不必明确命名每个 table .

类似

select * 来自 table_%

这样的事情可能吗?如果不是,编写此查询的最有效方法是什么?

你可以写"select * from table_1 and table_2 and tabl_3;"

这有点混乱,最好在中间层执行,但我想您基本上可以遍历表格并使用 EXECUTE IMMEDIATE 来完成。

类似于:

for t in (select table_name from all_tables where table_name like 'table_%') loop
  execute immediate 'select blah from ' || t.table_name;
end loop;

您可以使用 dbms_xmlgen 通过模式查询 tables,该模式生成 XML 文档作为 CLOB:

select dbms_xmlgen.getxml('select * from ' || table_name
  || ' where some_col like ''%Test%''') as xml_clob
from user_tables
where table_name like 'TABLE_%';

你说你想要一个条件,所以我添加了一个虚拟条件,where some_col like '%Test%'

然后您可以使用 XMLTable 将值提取回关系数据,在途中将 CLOB 转换为 XML类型:

select x.*
from (
  select xmltype(dbms_xmlgen.getxml('select * from ' || table_name
    || ' where some_col like ''%Test%''')) as xml
  from user_tables
  where table_name like 'TABLE_%'
) t
cross join xmltable('/ROWSET/ROW'
  passing t.xml
  columns id number path 'ID',
    some_col varchar2(10) path 'SOME_COL'
) x;

SQL Fiddle demo 从两个相似的 table 中的每一个中检索一个匹配行。当然,这假设您的 table 名称遵循有用的模式,例如 table_%,但您建议他们这样做。

这是我所知道的不求助于 PL/SQL 的唯一方法(并且回头搜索了一下,可能受到了启发 by this answer to count multiple tables)。它是否有效(足够)是您需要用数据测试的东西。