减少上下文切换

问题描述

问题:

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个表扫描。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...