【发布时间】: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 个时,可能有人认为这种设计是个好主意。这听起来像是需要进行重大重构。