避免笛卡尔积现象方式一

1 主要SQL语句

 

SELECT *

  FROM (
       
        SELECT row_.*,
               
                rownum rownum_
       
          FROM (
                 
                  SELECT matnr,
                         
                          maktx,
                         
                          lgort,
                         
                          lgobe,
                         
                          charg,
                         
                          labst,
                         
                          meins,
                         
                          matkl,
                         
                          wgbez,
                         
                          brgew,
                         
                          mtart,
                         
                          gewei,
                         
                          menge AS qty,
                         
                          holdQty
                 
                    FROM rtl_inventory_freed ri
                 
                   WHERE EXISTS
                 
                   (
                         
                          SELECT 'x'
                         
                            FROM rtl_sys_permission_inv pi
                         
                           WHERE pi.tenantCode = ri.tenantCode
                               
                             AND pi.lgort = ri.lgort
                               
                             AND pi.werks = ri.werks
                               
                             AND pi.userID = :1
                         
                          )
                       
                     AND tenantCode = :2
                       
                     AND werks = :3
                       
                     AND vkorg = :4
                       
                     AND vtweg = :5
                       
                     AND datuv <= :6
                       
                     AND sortf >= :7
                 
                  )
               
                row_
       
        )

 WHERE rownum_ BETWEEN 1 AND 50

 

 

2 查看其执行

 

出现笛卡尔积现象

 

计划

 

 

 

 

2  修改SQL语句,加/*+ ordered */

SELECT *

  FROM (
       
        SELECT row_.*,
               
                rownum rownum_
       
          FROM (
                 
                  SELECT /*+ ordered */ matnr,
                         
                          maktx,
                         
                          lgort,
                         
                          lgobe,
                         
                          charg,
                         
                          labst,
                         
                          meins,
                         
                          matkl,
                         
                          wgbez,
                         
                          brgew,
                         
                          mtart,
                         
                          gewei,
                         
                          menge AS qty,
                         
                          holdQty
                 
                    FROM rtl_inventory_freed ri
                 
                   WHERE EXISTS
                 
                   (
                         
                          SELECT 'x'
                         
                            FROM rtl_sys_permission_inv pi
                         
                           WHERE pi.tenantCode = ri.tenantCode
                               
                             AND pi.lgort = ri.lgort
                               
                             AND pi.werks = ri.werks
                               
                             AND pi.userID = :1
                         
                          )
                       
                     AND tenantCode = :2
                       
                     AND werks = :3
                       
                     AND vkorg = :4
                       
                     AND vtweg = :5
                       
                     AND datuv <= :6
                       
                     AND sortf >= :7
                 
                  )
               
                row_
       
        )

 WHERE rownum_ BETWEEN 1 AND 50

 

 

2 查看执行计划

 

 

 

 

计划

 

 

注:笛卡尔积现象消失。

 

 

总结:

 

   1 子查询容易造成笛卡尔积现象

   2 /*+ ordered */ 按在from从句中出现顺序连接表

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值