ORACLE里面的外连接和||

 ORACLE里面的外连接可以简写成:

 (+)=:右连接的简写

 也就是:保留右表存在,左表不存在的行!

=(+):左连接

 也就是:保留左表存在,右表不存在的行!

 对于这种简写的局限性是显而易见的

可读性就很差,需要花时间去理解.因为我们的思维方式是:首先是怎么去连接,然后用什么条件过滤!分成两步走,便使得SQL清晰易懂.

记得在数据结构里面,完成表达式求解的算法也是采取分两步走的策略,一:转换成后缀表达式,二:然后在求职!虽然一步理论上可以达到,但是根据电脑的思维方式,采取两步走,是最容易实现的!

而SQL就是宣称的以人类的思考方式去解决问题!

 

 

||在ORACLE里面是连接字符串,相当于+

在构造可执行的SQL字符串时候,对于IN 变量,动态构造SQL语句时候如下所示

       then
  tempsql := ' and sp.department_oid = '||''''||de_oid||'''';
       end if;           
       if vFlag = '1' then
         if flag ='1' then 
         open result for 
         'select t.inv_stock_oid INV_STOCK_OID,t.stock_type_id STOCK_TYPE_ID,t.inv_position_oid INV_POSITION_OID,nvl(t.safety,0)-t.qty state,
          t.part_no PART_NO,t.part_name PART_NAME,t.spec SPEC,t.unit UNIT,t.qty TOTALQTY,t.safety SAFETY,t.update_time UPDATE_TIME,
          t1.potion_id POSITION_ID,t1.description POSITION_DESC,t2.stock_type_id STOCK_TYPE_ID,t2.description TYPE_DESC,
          sp.inv_partnoclass_oid partnoclassoid,sp.qty DEQTY,sp.safe_qty SAFEQTY,de.department_name DEPARTMENT
          from inv_stock t,inv_position t1,inv_stock_type t2,inv_stock_partnoclass sp,basicdata_department de
          where  de.department_oid(+) = sp.department_oid'
          ||tempsql||'
          and sp.inv_stock_oid(+) = t.inv_stock_oid
          and t.stock_type_id = t2.inv_stock_type_oid 
          and t.inv_position_oid = t1.inv_position_oid(+)
          and t2.description='||''''||vCondition||''''||'                    
           order by state desc';
           return result; 

注意特别奇怪的如下写法

 tempsql := ' and sp.department_oid = '||''''||de_oid||'''';
t2.description='||''''||vCondition||''''||'  

 

为什么会有那么多单引号呢?

首先我来说我们期望的结果是:对于变量,这里用字符串常量来代替

sp.department_oid = 'something';

而在代码中那个变量仅仅替代值,也就是something,

还有前后两个单引号需要表示出来,但是它们是直接常量,所以当作字符串写,就需要再加两个单引号括起来,最后转义的一个

所以每次总共四个!

 

一定有比这个更好的解决办法,目前由于对于ORACLE是新手,好多东西都有待学习

欢迎共同讨论

 

 

你可能感兴趣的:(数据结构,oracle,sql,算法)