【发布时间】:2019-08-30 00:26:45
【问题描述】:
我有一个关于 Oracle PL/SQL 的问题。
在一个过程中,同一个嵌入的 SELECT 语句在查询中与 WHERE 子句一起重复使用:
...
where start_year in (
SELECT MB_START FROM MEMBERS
)
...
过程中嵌入在 WHERE 子句中的实际 SELECT 语句是 更详细,并替换为 'SELECT MB_START FROM MEMBERS' 来制作 我的问题在这里更容易理解。这正是我要问的原因 问题:
在许多 WHERE 子句中重复相同的子查询很麻烦,使得 阻塞的代码难以阅读,并且是服务器的潜在浪费 资源。有没有办法将嵌入式子查询返回的内容保存在变量中,例如:
DECLARE
start_years <type_for_IN_operator>;
BEGIN
...
select mb_start into start_years from members;
...
WHERE start_year in (start_years)
...
END;
/
我苦苦搜索,但未能确定 Oracle 是否支持将值保存在变量中以供 IN 运算符使用。如果支持,type_for_IN_operator 的数据类型是什么?
对答案和进一步问题的回应:
感谢大家对问题的回答。
我问这个问题是因为我观察到 IN 运算符接受一组不同形式的值,例如
- 文字:IN(2015、2016、2017)
- 从表中选择的列:IN(从成员中选择 mb_start)
- 通过 SELECT 语句的集合:in (select column_value from table(collection))
因此我认为它们可能有一些共同点,例如我不知道的数据类型。如果有这样的数据类型,查询代码会简单很多。
我被APC的想法所吸引,特别是它是纯sql,虚拟表是可重用的。我试过了,但是出了点问题。
脚本原本是:
select t.col1, t.col2, ... from
(
select ...
from ...
where start_year in (<that subquery>)
union
select ...
from ...
where start_year in (<that subquery>)
union
...
) t
join ...
...
现在使用虚拟表并替换第一个原始子查询:
with sqf as (
SELECT MB_START FROM MEMBERS
)
select t.col1, t.col2, ... from
(
select ...
from ...
where start_year in (select * from sqf)
union
select ...
from ...
where start_year in (<that subquery>)
union
...
) t
join ...
...
碰巧查询完成的速度甚至比原始代码还要快。但是,当第二个
有什么建议吗?
【问题讨论】: