首页 > 解决方案 > 具有多个列的 Oracle SQL 查询,使用相同的子查询和 OR

问题描述

在使用 OR 条件简化以下 Oracle SQL 查询时需要帮助:是否可以使用一个选择查询而不是多个选择查询。

对于这个子查询“从 usr 中选择 usr_key,其中 usr_login='abcd'”,我能够将其变为单个而不是写入 4 次,因为它只给出一个值。但是对于第二个子查询,它正在写入多个值,因此我无法将它们组合起来。

select * from catalog  where 
(
(select usr_key from usr where usr_login='abcd') in (approver_user,CERTIFIER_USER,FULFILLMENT_USER) 
or ('abcd') in (EMERGENCYAPPROVERUSER,SPECIALAPPROVERUSER)
or approver_role IN 
(select ugp.ugp_key from ugp , usg,usr uuu where ugp.ugp_key=usg.ugp_key and usg.usr_key=uuu.usr_key  and uuu.usr_login='abcd')
or CERTIFIER_ROLE IN 
(select ugp.ugp_key from ugp , usg,usr uuu where ugp.ugp_key=usg.ugp_key and usg.usr_key=uuu.usr_key  and uuu.usr_login='abcd')
or FULFILLMENT_ROLE IN 
(select ugp.ugp_key from ugp , usg,usr uuu where ugp.ugp_key=usg.ugp_key and usg.usr_key=uuu.usr_key  and uuu.usr_login='abcd')
)
and entity_type='Entitlement';


标签: sqloracleoracle11g

解决方案


使用 WITH 子句

WITH some_query AS(
    select ugp.ugp_key from ugp , usg,usr uuu 
    where ugp.ugp_key=usg.ugp_key and usg.usr_key=uuu.usr_key  and uuu.usr_login='abcd'
)
select * from catalog  
where 
(
    (select usr_key from usr where usr_login='abcd') in (approver_user,CERTIFIER_USER,FULFILLMENT_USER) 
    or 
    ('abcd') in (EMERGENCYAPPROVERUSER,SPECIALAPPROVERUSER)
    or 
    approver_role IN    (SELECT * FROM some_query)
    or 
    CERTIFIER_ROLE IN   (SELECT * FROM some_query)
    or 
    FULFILLMENT_ROLE IN (SELECT * FROM some_query)
)
and entity_type='Entitlement';

推荐阅读