【问题标题】:Oracle SQL Select from a Large Number of TablesOracle SQL 从大量表中选择
【发布时间】:2013-09-09 16:18:29
【问题描述】:

如果这已在其他地方得到回答,我深表歉意(该主题必须有一些内容),但我似乎无法为我的问题找到简明的答案。

我对 SQL 比较陌生,当我使用它时,我只使用基本语句。现在我正在使用一个非常大的数据库(在 Oracle 中),并被要求在开发方面对其进行一些探索以更加熟悉。

发送给我的用于探索数据库的问题之一涉及查找与特定用户关联的“运行控件”列表。

有一个表通过标题为run_cntl_id 的字段跟踪存在的不同类型的“运行控件”。此表中有 18 行与特定用户相关联,每行都有一个唯一的run_cntl_id。对于run_cntl_id 字段中的每个值,至少有一个对应的多行表(非常标准的数据库内容)。不幸的是,我没有任何参考资料来显示表格关系。

只有不到 3,000 个表同时包含 oprid(用户标识符)和 run_cntl_id(“运行控制”类型)字段(当它们分开时,有 3,100 个表包含 @ 987654326@ 字段,以及包含 oprid 字段的 8,800 个)。数据库中有大约 65,000 个表。有没有办法在这 3000 个表中搜索特定的 operid 和 run_cntl_id?

如果我想在一个表上执行这个查询,我会使用以下语句:

SELECT * 
FROM PS_JRNL_COPY_REQ
WHERE oprid = 'jle0010'
AND run_cntl_id = 'Copy_Jrnl';

换个说法:

有没有一种方法可以在上面提到的 3000 个表上执行这条语句,而不需要运行一条语句 3000 次?

【问题讨论】:

  • 这似乎是一个主要的设计缺陷。从技术上讲,您可以使用一条语句查询 3000 个表 - 但很可能它是一个动态 sql 语句,将所有这些表联合起来。我什至会考虑 Oracle 无法解析它的可能性。
  • 抱歉,您刚才是说您的数据库中有 65 千 个表。你确定吗?
  • 哈哈,我百分百肯定。
  • 您需要运行这些查询多少次?如果只有几次,那么您应该将几个大字符串组合在一起。
  • 65,000 大约是单个 PL/SQL 程序单元可以引用的对象数量,如果对它们的查询都超过了单个 SQL 语句的大小。当只有 20 个客户/用户而不是 3,000 个时,可能有人认为这种设计是个好主意。这听起来像是需要进行重大重构。

标签: sql oracle


【解决方案1】:

如果所有 3,000 个表都有相同的列,那么您的查询将如下所示:

SELECT * 
FROM   (
  select * from PS_JRNL_COPY_REQ union all
  select * from other_table_1    union all
  select * from other_table_2    union all
  ... and so on for 2,997 more)
WHERE oprid = 'jle0010'
AND run_cntl_id = 'Copy_Jrnl';

但不保证解析或运行。

当然,您可以通过查询 user_tables 来构建该内联视图。

【讨论】:

  • 是的,我不认为我会冒险...我会尝试找到更好的解决方案。我可能会很快发布另一个相关问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-10-25
  • 2017-05-29
  • 1970-01-01
  • 2022-01-27
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
相关资源
最近更新 更多