Oracle -- left join 什么情况可以直接改成join



标题: Oracle -- left join 什么情况可以直接改成join

作者: lōττéry ©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]


前言:
   一般开发人员都比较喜欢写left join,那是否有些情况不用根据业务情况就能将left join 改成join 呢?

情景 ①  left   join  B  on a.a=b.a  where    b.任意字段 =(只要不是is  null 可将left 去掉;
           理由 :根据left join特性不匹配显示空,而where是针对关联后的结果进行筛选
                     例如(where  b.a=1)那也就说明'is null'不匹配的过滤掉..既然不匹配的过滤掉那完全可以改成join了  

情景 ②  left   join  B  on 1=1  where  ..   可以将left 去掉;
           理由 :left join 和 join 都能实现  on 1=1 笛卡尔乘积

情景 ③  left   join  B  on (a.a=X or/and b.a=X )  where    b. 任意字段  =(只要不是is  null ),  可将left 去掉;
       理由 (a.a=X or/and b.a=X ) 筛选后不匹配的显示为空.. 所以where 传值 (只要不是is  null )就可以 将left去掉
     

注释:
很多时候即使写left join A where a.字段 is not null 情况。CBO生成执行计划时会自己判断成join的执行计划;
 此博客仅是对left join的where 和on 2部分 做一些了解;
以上三种情况可以统称: left   join  B  on ...  where    b.任意字段 =(只要不是is  null ) 都 可将left 去掉;
 

情景

【on a.a = b.a  部分 
SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    left join (SELECT 1 a, 2 b FROM dual) b
  7      on a.a = b.a
  8    where b.a =1;
 
         A          B          A          B
---------- ---------- ---------- ----------
         1          2          1          2

SQL> 
等同于 SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    /*left*/ join (SELECT 1 a, 2 b FROM dual) b
  7      on a.a = b.a
  8    where b.a =1;
 
         A          B          A          B
---------- ---------- ---------- ----------
         1          2          1          2
 
SQL>
SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    left join (SELECT 1 a, 2 b FROM dual) b
  7      on a.a = b.a
  8    where b.a is null;
 
         A          B          A          B
---------- ---------- ---------- ----------
         2          1           
 
SQL>
不等于 SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    /*left*/ join (SELECT 1 a, 2 b FROM dual) b
  7      on a.a = b.a
  8    where b.a is null;
 
         A          B          A          B
---------- ---------- ---------- ----------
 
SQL>


情景②

【on 1 = 1  部分  
SQL> SELECT *
  2    FROM (SELECT '1' a, 2 b
  3            FROM dual
  4          union all
  5          SELECT '2' a, 1 b FROM dual) a
  6    left join (SELECT '1' a, 2 b
  7                 FROM dual
  8               union all
  9               SELECT '' a, 3 b FROM dual) b
 10      on (1 = 1)
 11   where b.a =1;
 
A          B A          B
- ---------- - ----------
1          2 1          2
2          1 1          2
SQL>  
等同于 SQL>  SELECT *
  2    FROM (SELECT '1' a, 2 b
  3            FROM dual
  4          union all
  5          SELECT '2' a, 1 b FROM dual) a
  6    /*left*/ join (SELECT '1' a, 2 b
  7                 FROM dual
  8               union all
  9               SELECT '' a, 3 b FROM dual) b
 10      on (1 = 1)
 11   where b.a =1;
 
A          B A          B
- ---------- - ----------
1          2 1          2
2          1 1          2
 
SQL> 
情景③

【on (a.a = 1 or a.b =2) 部分
SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    left join (SELECT 1 a, 2 b
  7                 FROM dual
  8               union all
  9               SELECT 1 a, 3 b FROM dual) b
 10      on (b.a = 2 or b.b = 5)
 11   where b.b is null;
 
         A          B          A          B
---------- ---------- ---------- ----------
         1          2            
         2          1            
 
SQL> 
不等于 SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    /*left*/ join (SELECT 1 a, 2 b
  7                 FROM dual
  8               union all
  9               SELECT 1 a, 3 b FROM dual) b
 10      on (b.a = 2 or b.b = 5)
 11   where b.b is null;
 
         A          B          A          B
---------- ---------- ---------- ----------
 
SQL> 
SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    left join (SELECT 1 a, 2 b
  7                 FROM dual
  8               union all
  9               SELECT 1 a, 3 b FROM dual) b
 10      on (a.a = 2 or b.b = 5)
 11   where b.b is not null;
 
         A          B          A          B
---------- ---------- ---------- ----------
         2          1          1          2
         2          1          1          3
 
SQL> 
等同于 SQL> SELECT *
  2    FROM (SELECT 1 a, 2 b
  3            FROM dual
  4          union all
  5          SELECT 2 a, 1 b FROM dual) a
  6    /*left*/ join (SELECT 1 a, 2 b
  7                 FROM dual
  8               union all
  9               SELECT 1 a, 3 b FROM dual) b
 10      on (a.a = 2 or b.b = 5)
 11   where b.b is not null;
 
         A          B          A          B
---------- ---------- ---------- ----------
         2          1          1          2
         2          1          1          3
 
SQL> 

【on (a.a = 1 and a.b =2) 部分
SQL>  SELECT *
  2     FROM (SELECT 1 a, 2 b
  3             FROM dual
  4           union all
  5           SELECT 2 a, 1 b FROM dual) a
  6     left join (SELECT 1 a, 2 b
  7                  FROM dual
  8                union all
  9                SELECT 1 a, 3 b FROM dual) b
 10       on (a.a = 1 and b.b = 3)
 11    where b.b is null;
 
         A          B          A          B
---------- ---------- ---------- ----------
         2          1            
SQL> 
不等于 SQL>  SELECT *
  2     FROM (SELECT 1 a, 2 b
  3             FROM dual
  4           union all
  5           SELECT 2 a, 1 b FROM dual) a
  6     /*left*/ join (SELECT 1 a, 2 b
  7                  FROM dual
  8                union all
  9                SELECT 1 a, 3 b FROM dual) b
 10       on (a.a = 1 and b.b = 3)
 11    where b.b is null;
 
         A          B          A          B
---------- ---------- ---------- ----------
SQL>  
SQL>    SELECT *
  2     FROM (SELECT 1 a, 2 b
  3             FROM dual
  4           union all
  5           SELECT 2 a, 1 b FROM dual) a
  6     left join (SELECT 1 a, 2 b
  7                  FROM dual
  8                union all
  9                SELECT 1 a, 3 b FROM dual) b
 10       on (a.a = 1 and b.b = 3)
 11    where b.b is not null;
 
         A          B          A          B
---------- ---------- ---------- ----------
         1          2          1          3
SQL> 
等同于 SQL>  SELECT *
  2     FROM (SELECT 1 a, 2 b
  3             FROM dual
  4           union all
  5           SELECT 2 a, 1 b FROM dual) a
  6     /*left*/ join (SELECT 1 a, 2 b
  7                  FROM dual
  8                union all
  9                SELECT 1 a, 3 b FROM dual) b
 10       on (a.a = 1 and b.b = 3)
 11    where b.b is not null;
 
         A          B          A          B
---------- ---------- ---------- ----------
         1          2          1          3
 
SQL> 




此条目发表在 Oracle  分类目录。将固定连接 加入收藏夹。



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28602568/viewspace-1280508/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28602568/viewspace-1280508/

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值