我有这样的查询:
select * from SOURCE
where A = 'a'
and B in (
select SOMECOLUMN from VERY_LONG_QUERY
WHERE SOMECHECK = 'some check'
)
我想将上述查询转换为PL / SQL语句,如下所示:
veryLongQueryVar := 'select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = ''some check'' '
select * from SOURCE
where A = 'a'
and B in veryLongQueryVar
怎么可能?
答案 0 :(得分:0)
以下是您可以做什么的建议。
您将长查询中的值存储在一个集合中,并在另一个选择中使用它。
declare
TYPE my_collection IS TABLE OF SOMECOLUMN%type
INDEX BY number;
tab my_collection ;
rec SOURCE%rowtype;
begin
select SOMECOLUMN
bulk collect into tab
from VERY_LONG_QUERY
WHERE SOMECHECK = 'some check';
select * into rec
from SOURCE
where A = 'a'
and B in (select column_value from table(tab);
end;
您还可以创建动态SQL字符串。
declare
TYPE cur IS REF CURSOR;
my_cur cur;
veryLongQueryVar varchar2(32000);
begin
veryLongQueryVar := 'select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = ''some check'' '
veryLongQueryVar := 'select * from SOURCE
where A = ''a''
and B in ('||veryLongQueryVar ||')'
open my_cur for veryLongQueryVar ;
....
end;
答案 1 :(得分:0)
您可以通过WITH
clause实现类似的目标:
with veryLongQueryVar as
(select SOMECOLUMN from VERY_LONG_QUERY WHERE SOMECHECK = 'some check')
select * from SOURCE
where A = 'a'
and B in (select SOMECOLUMN from veryLongQueryVar)
您还可以使用SELECT INTO
将非常长的查询结果选择为变量(某种类型的表)和use table
to pass it into IN。但这将导致两个单独的查询,看来您想避免这种情况。