我正在做一个新的过程,对一个巨大的表进行查询。
我的过程结构如下:
{
打开游标
查询1
友联市
查询2
友联市
查询3
}
查询1的结构是内部连接2(内部连接1(表)x(表)x表)
查询2的结构是内部连接3(内部连接1(表)x(表)x表)
有没有办法把INNER JOIN 1 (TABLE) x (TABLE)存储在某个地方,这样我就不用做两次了?
编辑:忘记添加我不能在过程外部创建表,因为此过程的多个实例将并行运行。它们只会通过在同一个表中插入来阻止对方运行。此外,我不知道有多少实例将并行运行,因此我不能创建与实例一样多的表。
发布于 2020-01-09 18:53:49
不要从PL/SQL创建任何表。这是可能的(提示:动态SQL),但这不是Oracle的工作方式。
如果您需要一个表,那么在运行这个过程之前创建它,使用CREATE TABLE (并命名您需要的所有列),或者使用CTAS (Create table As Select),这基本上就是您的当前查询。
该表可以是“普通”或“全局(或私有,取决于数据库版本)临时表”(GTT)。如果您使用GTT,则只有您可以看到存储在其中的数据。如果它是一个“普通”表,那么每个人都会看到数据,所以你可能需要注意谁看到了什么,谁使用了什么。
另一种选择是使用CTE (公用表表达式,也称为WITH分解子句),它可以直接在过程中使用,如下所示
with your_view as
(select ...
from table1 join table2 on ...
join table3 on ...
)
select whatever
from some_other_table join your_view
where ...
union
select whatever_else
from yet_another_table join your_View
where ...在看到您的编辑后,进行编辑
如果您出于某种原因不想使用CTE,那么GTT可能是您的选择。为什么?参见我的第三段(“每个人都只能看到自己的数据”)。
发布于 2020-01-09 19:49:58
https://stackoverflow.com/questions/59662260
复制相似问题