当 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
. . .
)
我想将使用 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
. . .
)