How to replace the IN operator with EXISTS operator, for the where clause part of the query?

时间:2015-07-08 15:39:58

标签: sql oracle11g

WHERE ( 
((SERVICECOMPONENT_ID IN (123, 150, 198, 199, 290, 287, 291, 289, 288, 286, 282, 281)))  

OR ((SERVICEREQUEST_ID IN ( 
        SELECT distinct(SR.SERVICEREQUEST_ID) 
        FROM SERVICE_REQUEST SR,ASSIGNED_SR_PROJECTS ASP,PROJECT_RESOURCES PRS 
        WHERE SR.SERVICEREQUEST_ID = ASP.SERVICEREQUEST_ID 
        AND PRS.PROJECT_ID = ASP.PROJECT_ID 
        AND PRS.RESPONSIBILITY IN ('MANAGER','LEAD') 
        AND PRS.RESOURCE_ID =180 )) )

)

2 个答案:

答案 0 :(得分:1)

一般来说,

SELECT a FROM b WHERE c IN (SELECT d FROM e)

相当于

SELECT a FROM b WHERE EXISTS (SELECT 1 FROM e WHERE c = d)

代码示例中的SERVICEREQUEST_ID IN(子查询)部分转换为:

OR EXISTS (
    SELECT 1
    FROM
        SERVICE_REQUEST SR,
        ASSIGNED_SR_PROJECTS ASP,
        PROJECT_RESOURCES PRS
    WHERE
        SR.SERVICEREQUEST_ID = ASP.SERVICEREQUEST_ID
        AND PRS.PROJECT_ID = ASP.PROJECT_ID
        AND PRS.RESPONSIBILITY IN ('MANAGER', 'LEAD')
        AND PRS.RESOURCE_ID = 180
        AND mytable.SERVICEREQUEST_ID = SR.SERVICEREQUEST_ID
)

答案 1 :(得分:1)

如果你有静态的元素列表最好使用“IN”....如果你有一个子查询并且它返回了多个值,那么使用存在 ... 两个条款都没有区别..

WHERE ( 
 ( (SERVICECOMPONENT_ID IN (  123  ,   150  ,   198  ,   199  ,   290  ,   287  ,   291  ,   289  ,   288  ,   286  ,   282  ,   281 )) )  
 OR ( (SERVICEREQUEST_ID IN (  1952  ,  2387  ,  3618  ,  3633  ,  4178  ,  4432  ,  5090  ,  5271  ,  6068  ,  6320  ,  6396  ,  6526  ,  7162  ,  7442  ,  7558  ,  7639  ,  7688  ,  8176  ,  8189  ,  8338  ,  8460  ,  8461  ,  8598  ,  8612  ,  8628  ,  8675  ,  8775  ,  8869  ,  8886  ,  8898  )) )  
 OR ( (REQUESTED_BY LIKE 'XXXXXXX@example.com' ) )  
 OR ( ( EXISTS ( SELECT count(distinct(SR.SERVICEREQUEST_ID)) FROM SERVICE_REQUEST SR,ASSIGNED_SR_PROJECTS ASP,PROJECT_RESOURCES PRS WHERE SR.SERVICEREQUEST_ID = ASP.SERVICEREQUEST_ID AND PRS.PROJECT_ID = ASP.PROJECT_ID AND PRS.RESPONSIBILITY IN ('MANAGER','LEAD') AND PRS.RESOURCE_ID =180 )) )  
 OR ( (STATUS_CODE LIKE 'OPEN' ) AND ( EXISTS (SELECT count(COMPONENT.CATEGORY_ID) FROM PROJECTMASTER PROJECTS, BUDGET BUDGET, CONTRACT CONTRACT,COMPONENTS COMPONENT, PROJECT_RESOURCES PROJ_RESOURCES, CATEGORY_OWNER_ASSIGNMENT CATEGORYOWNER, SERVICECATEGORYASSIGNMENT CATEGORYASSIGNMENT WHERE PROJECTS.PROJECT_ID = PROJ_RESOURCES.PROJECT_ID AND PROJECTS.BUDGET_ID = BUDGET.BUDGET_ID AND BUDGET.CONTRACT = CONTRACT.CONTRACT_ID AND CATEGORYASSIGNMENT.CONTRACT_ID = CONTRACT.CONTRACT_ID AND COMPONENT.COMPONENT_ID = CATEGORYASSIGNMENT.COMPONENT_ID AND CATEGORYOWNER.CATEGORY_ID = COMPONENT.CATEGORY_ID AND CATEGORYOWNER.USER_ID = PROJ_RESOURCES.RESOURCE_ID AND (CATEGORYOWNER.OWNER_FLAG = 'Y' OR CATEGORYOWNER.MEMBER_FLAG = 'Y') AND PROJ_RESOURCES.RESOURCE_ID = 180 AND PROJ_RESOURCES.ACTIVE_FLAG = 'Y' AND CATEGORYASSIGNMENT.ACTIVE_FLAG = 'Y' AND PROJ_RESOURCES.RESPONSIBILITY IN ('MANAGER', 'LEAD') )) ) 
 )

阅读此内容以进一步澄清.. Difference between EXISTS and IN in SQL?