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是新手,好多东西都有待学习

欢迎共同讨论

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值