一次查询多个相似表
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)。它是否有效(足够)是您需要用数据测试的东西。
我有一个 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)。它是否有效(足够)是您需要用数据测试的东西。