Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1184536
  • 博文数量: 398
  • 博客积分: 10110
  • 博客等级: 上将
  • 技术积分: 4055
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-23 20:01
个人简介

新博客http://www.cnblogs.com/zhjh256 欢迎访问

文章分类

全部博文(398)

文章存档

2012年(1)

2011年(41)

2010年(16)

2009年(98)

2008年(142)

2007年(100)

我的朋友

分类: Oracle

2010-01-26 10:54:09

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行,和非外连接的结果集相同.
 
阅读(995) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~