sql - 具有多个列的 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';
解决方案
使用 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';
推荐阅读
- php - 如何在不同的 MYSQL 数据库表字段中删除部分 HTML
- c++ - 如何制作仅在调用时才执行命令的控制台应用程序
- python - 比较字符串的标准是什么?
- amazon-s3 - Cloud Dataflow:在 AWS S3 (TextIO.read) 上读取 csv 文件的步骤有时会卡住
- spring - 使用 Spring Boot 从另一个微服务访问网关属性
- java - 自定义 Spring AOP 注解不适用于默认方法
- drools - Drools 水平可扩展性
- cmake - CMake find_path / find_library 是否搜索
_ROOT 默认? - python - 从字典值中删除方括号的函数
- python - 使用 tkinter 为每个按钮添加不同的图像