问题描述
问题:
Oracle sql-我有2个选择查询(说SQ1和SQ2)。 SQ1和SQ2都选择一个ID值,但是具有不同的联接条件,差异表和where条件。
方案1:如果SQ1返回1行,请使用select语句的结果对表进行更新。 如果SQ1返回0行或多于1行,则控制应转到方案2。
方案2:如果SQ2返回1行,请使用SQ2语句的结果对表进行更新。 如果SQ2返回0或> 1,则调用另一个打包过程。
如何将最少的上下文切换到数据库?
我的编码方式:
select count(*) into v_count from table; ---SQ1
case if v_count=1 ...then do this...
Else
select count(*) into v_count2 from table; ---SQ2
--2nd case starts here
case if
v_count2=1 ...then do this...
else call package.procedure.
end case;
end case;
要求
解决方法
嗯,没有其他信息,这样的事情应该起作用:
update t
set col = coalesce( (<SQL1>),(<SQL2>)
where (select count(*) from <sql1>) = 1 or
(select count(*) from <sql2) = 1;
也就是说,我可能会修复您的过滤语句,使它们返回0或1行,从不超过1行。
,SQ2与SQ1是相同的select语句,但是附加了where条件。
您只能做一个这样的声明
SELECT
count(*),count( case when ... /*additional where condition for SQ2 */ then 1 end )
INTO v_count,v_count2
FROM table
然后执行一系列IF-THEN-ELSIF语句:
IF v_count = 1 THEN
..do this...
ELSIF v_count2=1 THEN
...do that...
ELSE
call package.procedure.
END IF;
通过这种方式,您可以保存1个上下文切换和1个表扫描。