如何合并仅WHERE子句条件不同的两条Oracle审计SQL语句?
优化合并两条仅AUDIT_OPTION不同的Oracle SQL查询语句
这事儿很简单!你这两条SQL除了AUDIT_OPTION的取值不一样,其他条件完全相同,直接用IN子句就能把它们合并成一条干净的查询,效果和分开执行完全一样,还能提升代码的可读性和可维护性。
优化后的SQL语句
SELECT AUDIT_OPTION, SUCCESS, FAILURE FROM DBA_STMT_AUDIT_OPTS WHERE AUDIT_OPTION IN ('USER', 'ALTER USER') AND USER_NAME IS NULL AND PROXY_NAME IS NULL AND SUCCESS = 'BY ACCESS' AND FAILURE = 'BY ACCESS';
补充说明
- 这个查询会返回两条原语句的所有结果,逻辑上等价于分别执行两条查询后合并结果。
- 如果之后需要添加更多需要匹配的
AUDIT_OPTION值,直接在IN的括号里追加即可,不用重复复制整段SQL,维护起来更方便。
另一种等价写法(用OR)
如果你更习惯用OR,也可以这样写,效果完全一致:
SELECT AUDIT_OPTION, SUCCESS, FAILURE FROM DBA_STMT_AUDIT_OPTS WHERE (AUDIT_OPTION = 'USER' OR AUDIT_OPTION = 'ALTER USER') AND USER_NAME IS NULL AND PROXY_NAME IS NULL AND SUCCESS = 'BY ACCESS' AND FAILURE = 'BY ACCESS';
不过对比下来,IN的写法更直观,尤其是当需要匹配的取值数量较多时,代码会更清爽。Oracle的查询优化器对这两种写法的处理通常是等价的,不会有性能差异,所以优先选更易读的IN就好。
内容的提问来源于stack exchange,提问作者Rahmouni Abdelhak
相关产品推荐
相关产品推荐

