当 Union All 存在于子查询中时使用 Exists

Using Exists when Union All is present in the Sub Query

我想将使用 IN 运算符编写的查询修改为使用 Exists 运算符。但是,问题是我的子查询中有 union all 。由于我在这种情况下使用 exists 的经验不多,所以我正在寻求帮助。

这是初始查询:

select APP_NUM,SBM_INDV_ID 
from T1004_APP_INDV indv 
where INDV.APP_NUM = 'T23952717' 
and INDV.SBM_INDV_ID in
  (select EMPL.INDV_ID 
   from DC_EMPLOYMENT EMPL 
   where EMPL.LOST_EMPLOYMENT_SW = 'N' 
   and EMPL.TERMINATION_DT is null 
   and (EMPL.EFF_END_DT is null 
     or EMPL.EFF_END_DT >= TRUNC(SYSDATE))     
   union all
   select UNEARN.INDV_ID 
   from DC_UNEARNED_INCOME UNEARN 
   where UNEARN.EFF_END_DT is null 
   or UNEARN.EFF_END_DT >= TRUNC(SYSDATE)  
   union all
   select RBINC.INDV_ID 
   from DC_ROOM_BOARD_INCOME RBINC 
   where RBINC.EFF_END_DT is null 
   or RBINC.EFF_END_DT >= TRUNC(SYSDATE)
   union all
   select SELFEMP.INDV_ID 
   from DC_SELF_EMP_INCOME SELFEMP 
   where SELFEMP.EFF_END_DT is null 
   or SELFEMP.EFF_END_DT >= TRUNC(SYSDATE)
);  

我尝试按如下方式更改初始查询:

select APP_NUM,SBM_INDV_ID 
from T1004_APP_INDV APPINDV 
where APPINDV.APP_NUM = 'T23952717' 
and exists
  (select EMPL.INDV_ID 
   from DC_EMPLOYMENT EMPL 
   where APPINDV.SBM_INDV_ID = EMPL.INDV_ID 
   and EMPL.LOST_EMPLOYMENT_SW = 'N' 
   and EMPL.TERMINATION_DT is null 
   and (EMPL.EFF_END_DT is null 
     or EMPL.EFF_END_DT >= TRUNC(SYSDATE))     
   union all
   select UNEARN.INDV_ID 
   from DC_UNEARNED_INCOME UNEARN 
   where APPINDV.SBM_INDV_ID = UNEARN.INDV_ID 
   and UNEARN.EFF_END_DT is null 
   or UNEARN.EFF_END_DT >= TRUNC(SYSDATE)  
   union all
   select RBINC.INDV_ID 
   from DC_ROOM_BOARD_INCOME RBINC 
   where APPINDV.SBM_INDV_ID = RBINC.INDV_ID 
   and RBINC.EFF_END_DT is null 
   or RBINC.EFF_END_DT >= TRUNC(SYSDATE)
   union all
   select SELFEMP.INDV_ID 
   from DC_SELF_EMP_INCOME SELFEMP 
   where APPINDV.SBM_INDV_ID = SELFEMP.INDV_ID 
   and SELFEMP.EFF_END_DT is null 
   or SELFEMP.EFF_END_DT >= TRUNC(SYSDATE)); 

第二个查询是否正确?它产生的结果是否与之前的查询相同?

谢谢

我认为将其拆分为单独的查询会使优化器更简单:

where APPINDV.APP_NUM = 'T23952717' and
      ( exists (select 1 
                from DC_EMPLOYMENT EMPL 
                where APPINDV.SBM_INDV_ID = EMPL.INDV_ID and
                      EMPL.LOST_EMPLOYMENT_SW = 'N' and
                      EMPL.TERMINATION_DT is null and
                     (EMPL.EFF_END_DT is null or EMPL.EFF_END_DT >= TRUNC(SYSDATE)
               ) or
        exists (select 1
                from DC_UNEARNED_INCOME UNEARN 
                where APPINDV.SBM_INDV_ID = UNEARN.INDV_ID and
                      ( UNEARN.EFF_END_DT is null and or UNEARN.EFF_END_DT >= TRUNC(SYSDATE) )
               ) or
        . . .
     )