oracle sql外连接的时候谓词的应用顺序是会影响结果的

文章讨论了在OracleSQL中,外连接查询时谓词的应用顺序可能影响查询结果,而这种情况在非外连接查询中并不明显。通过提供多个查询示例,展示了不同的谓词顺序可能导致的不同结果计数,强调了优化查询语句的重要性。
摘要由CSDN通过智能技术生成

oracle sql外连接的时候谓词的应用顺序是会影响结果的, 非外连接则没有关系, 不过oracle之所以这样,虽然理解上觉得有点不可思议, 应该也是有其原因的.

SELECT COUNT(DISTINCT B.COMPANY_ID)
  FROM (SELECT *
          FROM ODS.BAS_TAB_EMPLOYEE_FJYD C
         WHERE C.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
           AND C.REG_DATE < TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/,
                                    'YYYY-MM-DD HH24:MI:SS')
           AND (C.EMPLOYEE_STATUS = 1 OR
               C.EMPLOYEE_STATUS = 0 AND
               C.PAUSE_DATE >=
               TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                        'YYYY-MM-DD HH24:MI:SS') OR
               NVL(C.PAUSE_DATE, C.UNREG_DATE) >=
               TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                        'YYYY-MM-DD HH24:MI:SS'))) C,
       ODS.BAS_TAB_COMPANY_FJYD B
 WHERE B.COMPANY_ID = C.COMPANY_ID
     
   AND B.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
   AND B.REG_DATE <
       TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/, 'YYYY-MM-DD HH24:MI:SS')
   AND (B.COMPANY_STATUS = 1 OR
       B.COMPANY_STATUS = 0 AND
       B.PAUSE_DATE >= TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                                'YYYY-MM-DD HH24:MI:SS') OR
       NVL(B.PAUSE_DATE, B.UNREG_DATE) >=
       TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                'YYYY-MM-DD HH24:MI:SS'))

---4813行

SELECT COUNT(DISTINCT B.COMPANY_ID)
  FROM ODS.BAS_TAB_COMPANY_FJYD B, ODS.BAS_TAB_EMPLOYEE_FJYD C
 WHERE C.COMPANY_ID = B.COMPANY_ID
     
   AND B.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
   AND B.REG_DATE <
       TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/, 'YYYY-MM-DD HH24:MI:SS')
   AND (B.COMPANY_STATUS = 1 OR
       B.COMPANY_STATUS = 0 AND
       B.PAUSE_DATE >= TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                                'YYYY-MM-DD HH24:MI:SS') OR
       NVL(B.PAUSE_DATE, B.UNREG_DATE) >=
       TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                'YYYY-MM-DD HH24:MI:SS'))
     
   AND C.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
   AND C.REG_DATE <
       TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/, 'YYYY-MM-DD HH24:MI:SS')
   AND (C.EMPLOYEE_STATUS = 1 OR
       C.EMPLOYEE_STATUS = 0 AND
       C.PAUSE_DATE >= TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                                'YYYY-MM-DD HH24:MI:SS') OR
       NVL(C.PAUSE_DATE, C.UNREG_DATE) >=
       TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                'YYYY-MM-DD HH24:MI:SS'));

--4813行.

SELECT COUNT(DISTINCT B.COMPANY_ID)
  FROM (SELECT *
          FROM ODS.BAS_TAB_EMPLOYEE_FJYD C
         WHERE C.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
           AND C.REG_DATE < TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/,
                                    'YYYY-MM-DD HH24:MI:SS')
           AND (C.EMPLOYEE_STATUS = 1 OR
               C.EMPLOYEE_STATUS = 0 AND
               C.PAUSE_DATE >=
               TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                        'YYYY-MM-DD HH24:MI:SS') OR
               NVL(C.PAUSE_DATE, C.UNREG_DATE) >=
               TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                        'YYYY-MM-DD HH24:MI:SS'))) C,
       ODS.BAS_TAB_COMPANY_FJYD B
 WHERE B.COMPANY_ID = C.COMPANY_ID(+)
     
   AND B.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
   AND B.REG_DATE <
       TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/, 'YYYY-MM-DD HH24:MI:SS')
   AND (B.COMPANY_STATUS = 1 OR
       B.COMPANY_STATUS = 0 AND
       B.PAUSE_DATE >= TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                                'YYYY-MM-DD HH24:MI:SS') OR
       NVL(B.PAUSE_DATE, B.UNREG_DATE) >=
       TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                'YYYY-MM-DD HH24:MI:SS'))

--8441行

SELECT COUNT(DISTINCT B.COMPANY_ID)
  FROM ODS.BAS_TAB_COMPANY_FJYD B, ODS.BAS_TAB_EMPLOYEE_FJYD C
 WHERE C.COMPANY_ID(+) = B.COMPANY_ID
     
   AND B.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
   AND B.REG_DATE <
       TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/, 'YYYY-MM-DD HH24:MI:SS')
   AND (B.COMPANY_STATUS = 1 OR
       B.COMPANY_STATUS = 0 AND
       B.PAUSE_DATE >= TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                                'YYYY-MM-DD HH24:MI:SS') OR
       NVL(B.PAUSE_DATE, B.UNREG_DATE) >=
       TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                'YYYY-MM-DD HH24:MI:SS'))
     
   AND C.END_DATE = TO_DATE('3000-12-31', 'YYYY-MM-DD')
   AND C.REG_DATE <
       TO_DATE('2010-01-24 00:00:00' /*:v_end_dt*/, 'YYYY-MM-DD HH24:MI:SS')
   AND (C.EMPLOYEE_STATUS = 1 OR
       C.EMPLOYEE_STATUS = 0 AND
       C.PAUSE_DATE >= TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                                'YYYY-MM-DD HH24:MI:SS') OR
       NVL(C.PAUSE_DATE, C.UNREG_DATE) >=
       TO_DATE('2010-01-23 00:00:00' /*:v_start_dt*/,
                'YYYY-MM-DD HH24:MI:SS'));
--4813行,和非外连接的结果集相同.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值