【发布时间】:2015-11-23 08:06:25
【问题描述】:
我有一个 Oracle 数据库,其中包含许多具有相同结构的表(列都是相同的)。表名也相似。表的名称如 table_1、table_2、table_3...
我知道这不是最有效的设计,但我目前无法更改。
在这种情况下,是否可以进行单个 sql 查询,在多个表(数百个表)中提取所有具有相同条件的行,而无需显式使用确切的表名?
我意识到我可以使用类似的东西 select * from table_1 UNION select * from table_2 UNION select * from table_3...select * from table_1000
但是有没有更优雅的 sql 语句可以运行,它从所有匹配的表名中提取到一个结果中,而不必显式地命名每个表。
类似
select * from table_%
这样的事情可能吗?如果不是,那么编写此查询的最有效方法是什么?
【问题讨论】:
-
Select * from table_% .. 不起作用。如果您不想自己编写查询。您可以在 sybObject 中搜索 table_% 之类的表,并通过一一解析来构建查询。
-
是的,我知道我可以做到,但我希望有一个更优雅的解决方案。如果不可能有更优雅的东西,那么我将不得不采用某种我试图避免的循环。
-
假设表的数量保持不变,您可以创建一个将所有表合并在一起的视图,然后查询该视图。但是,我不想保证 Oracle 在这种情况下是否能够推送谓词——您必须进行测试。另外,你需要结果是不同的吗?我很想使用 UNION ALL 而不是 UNION 创建视图,然后如果您确实需要结果是不同的,则在最终结果周围抛出一个不同的。
-
不,在这种情况下,会不断添加和删除表,因此表数会发生变化。我调查了一个观点,但我认为问题仍然相似,不是吗?你仍然需要做一个很长的显式多表语句,我希望有一个更简单的方法。
-
不,没有更简单的方法。您仍然需要在某个时候准确地告诉 Oracle 要查询哪些表。听起来像编写查询来编写查询是要走的路(正如@Ajay 建议的那样),除了您要查询的是 user_tables (或适当的 all_tables/dba_tables )。