Sql奇技淫巧之EXIST实现分层过滤

在这样一个场景,我 left join 了很多张表,用这些表的不同列来过滤,看起来非常合理
但是出现的问题是 left join 其中一张或多张表出现了笛卡尔积,且无法消除

FUNCTION fun_get_xxx_helper(v_param_1 VARCHAR2,v_param_2 VARCHAR2,v_param_3 VARCHAR2) 
RETURN t_xxx_tab pipelined 
ASv_cur t_xxx_cur;v_rec v_cur%ROWTYPE;
BEGINOPEN v_cur FORSELECT R.*FROM (SELECT one.colum_1,one.colum_2,three.colum_1,two.colum_1FROM table_one oneLEFT JOIN table_two two ON one.colum_1= two.colum_1LEFT JOIN table_three three ON one.colum_1= three.colum_1-- left join table_four 是为了用它其中一列作为过滤条件,但是会产生笛卡尔积,且无法消除LEFT JOIN table_four four ON one.colum_1= four.colum_1 WHERE (v_param_1 is not null AND one.colum_1= v_param_1 ) AND(v_param_2 is null or two.colum_2 = v_param_2 ) AND-- 在这里用到了 table_four.colum_3 作为过滤条件(v_param_3 is null or four.colum_3 = v_param_3 ))R-- 输出部分LOOPFETCH v_cur INTO v_rec;EXIT WHEN v_cur%notfound;PIPE ROW (v_rec);END LOOP;
END fun_get_xxx_helper;

这个时候可以把原本会产生笛卡尔积的那张表先舍弃掉,把它放在外层 select 的 where 子句中,以子查询的方式实现过滤

改良后:

FUNCTION fun_get_xxx_helper(v_param_1 VARCHAR2,v_param_2 VARCHAR2,v_param_3 VARCHAR2) 
RETURN t_xxx_tab pipelined 
ASv_cur t_xxx_cur;v_rec v_cur%ROWTYPE;
BEGINOPEN v_cur FORSELECT R.*FROM (SELECT one.colum_1 id,one.colum_2 name,three.colum_1 age,two.colum_1 genderFROM table_one oneLEFT JOIN table_two two ON one.colum_1= two.colum_1LEFT JOIN table_three three ON one.colum_1= three.colum_1WHERE (v_param_1 is not null AND one.colum_1= v_param_1 ) AND(v_param_2 is null or two.colum_2 = v_param_2 ))RWHERE v_param_3 is null OR( EXISTS ( SELECT 1FROM table_four fourWHERE four.colum_1= R.id AND four.colum_3  = v_param_3 ))-- 输出部分LOOPFETCH v_cur INTO v_rec;EXIT WHEN v_cur%notfound;PIPE ROW (v_rec);END LOOP;
END fun_get_xxx_helper;

在里层 select 中先把前面的过滤做了,然后在外层的 select 的 where 子句中过滤
v_param_3null则不过滤,不为空则用EXISTS ()函数配合select 1子查询来做过滤
R.idv_param_3作为过滤条件查询table_four中是否有此数据,若有则保留里层R.id对应的那条数据,没有则将其过滤掉;

  1. select 1表示当含有满足条件的时候返回一个常量 1,可以看作一条 record
  2. EXISTS是SQL中的一个逻辑运算符,通常用于检查子查询中的行是否存在;
    EXISTS (subquery)它根据子查询是否返回任何行返回一个布尔值,如果子查询至少返回一行,则返回结果为True,子查询没有返回任何行,则返回结果为False
    通常与WHEREHAVING子句配合使用,有条件地过滤或连接数据;
    =================================================================
    例如,在执行删除或更新数据之前,可以使用EXISTS检查相关表中是否存在这条记录:
    DELETE FROM table_name
    WHERE EXISTS (SELECT 1 FROM related_table WHERE related_table.id = table_name.id);
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

shell脚本条件测试语句,if,case

shell脚本条件测试语句,if,case 一.条件测试1.1test命令1.2文件测试1.2.1文件测试常见选项 1.3数值比较1.4字符串比较1.5逻辑测试 二.if语句2.1单分支结构2.3多分支 三.case语句 一.条件测试 1.1test命令 测试特定的表达式是否成立,当条件成…

Http常见状态码

一、状态码大类 状态码分类说明1xx响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它2xx成功——表示请求已经被成功接收,处理已完成3xx重定向——重定向到其它地方:它让客户端再发起一个…

BGP基础实验建邻+宣告实验

实验题目如下: 实验拓扑如下: 实验要求如下: 【1】除R5的5.5.5.0环回外,其他所有的环回均可互相访问 实验思路如下: (1)合理的IP配置 (2)合理的BGP配置 (…

LeetCode 518. 零钱兑换 II(动态规划 完全背包)

题目&#xff1a; 链接&#xff1a;LeetCode 518. 零钱兑换 II 难度&#xff1a;中等 动态规划&#xff1a; dp[i][j] 定义&#xff1a;可选前 i 种硬币的情况下&#xff0c;组成金额 j 的组合数。 初始状态&#xff1a; dp[0][j] 0, 1 < j < amount&#xff08;不选…

SQL | 计算字段

7-创建计算字段 7.1-计算字段 存储在数据库中的数据一般不是我们所需要的字段格式&#xff0c; 需要公司名称&#xff0c;同时也需要公司地址&#xff0c;但是这两个数据存储在不同的列中。 省&#xff0c;市&#xff0c;县和邮政编码存储在不同的列中&#xff0c;但是当我们…

工厂老化设备维护的重要性及如何维护老化设备?

工业领域的老化设备问题日益凸显&#xff0c;对于保持生产稳定和效率至关重要。本文将探讨工厂老化设备维护的重要性&#xff0c;并介绍如何通过PreMaint设备数字化平台实现对老化设备的高效维护&#xff0c;从而确保工厂持续高效运转。 一、工厂老化设备的重要性 随着时间的推…

基于Python爬虫+词云图+情感分析对某东上完美日记的用户评论分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

在SPSS中实现数据转置

在使用SPSS开展数据分析的过程中&#xff0c;有时候不可避免需要对数据进行转置处理。 例如Kendall协同系数检验和组内相关系数&#xff08;ICC&#xff09;检验这两种方法都可以检验定量数据的一致性程度&#xff0c;但是这两种方法对数据的要求不同。 组内相关系数&#xf…

layui 集成 ztree异步加载

首先&#xff0c;layui环境搭建&#xff0c;ztree环境引入 ztree的js和css都要引入&#xff0c;我这里暂时用的是core包> 静态&#xff0c;一句话就够了 <!-- 左侧菜单树形组件 --><div class"layui-col-md3"><div class"layui-footer "…

Ajax-概念、Http协议、Ajax请求及其常见问题

Ajax Ajax概念Ajax优缺点HTTP协议请求报文响应报文 Ajax案例准备工作express基本使用创建一个服务器 发送AJAX请求GET请求POST请求JSON响应 Ajax请求出现的问题IE缓存问题Ajax请求超时与网络异常处理Ajax手动取消请求Ajax重复发送请求问题 Ajax概念 AJAX 全称为Asynchronous J…

干货 | 详述 Elasticsearch 向量检索发展史

1. 引言 向量检索已经成为现代搜索和推荐系统的核心组件。 通过将复杂的对象&#xff08;例如文本、图像或声音&#xff09;转换为数值向量&#xff0c;并在多维空间中进行相似性搜索&#xff0c;它能够实现高效的查询匹配和推荐。 图片来自&#xff1a;向量数据库技术鉴赏【上…

安科瑞物联网表在虚拟电厂的应用

安科瑞 崔丽洁 应用场景 一般应用于控制中心 功能 能计量当前组合有功电能&#xff0c;正向有功电能&#xff0c;反向有功电能&#xff0c;正向无功电能&#xff0c;反向无功电能&#xff1b; ADW300支持RS485通讯、LORA通讯、NB、4G及Wifi通讯&#xff1b; 三套时段表,一年可以…

[oeasy]python0081_[趣味拓展]ESC键进化历史_键盘演化过程_ANSI_控制序列_转义序列_CSI

光标位置 回忆上次内容 上次了解了 新的转义模式 \033 逃逸控制字符 escape 这个字符 让字符串 退出标准输出流进行控制信息的设置 可以设置 光标输出的位置 ASR33中的ALT MODE 是 今天的ESC键吗&#xff1f;&#xff1f;&#xff1f;&#xff1f;&#x1f914; 查询文档…

关于APP备案、小程序备案的问题,如何备案?

近日&#xff0c;工信部发布了关于开展移动互联网应用程序备案工作的通知。为落实相关法律法规要求&#xff0c;促进互联网行业规范健康发展&#xff0c;进一步做好移动互联网信息服务管理&#xff0c;现组织开展移动互联网应用程序&#xff08;以下简称 APP&#xff09;备案工…

安灯Andon系统的应用与优势

安灯系统是一款与硬件相结合&#xff0c;实时了解机台与工位状态&#xff0c;让异常的信息得到快速、高效的解决的系统软件&#xff0c;同时记录每次异常报警的种类、响应时间和处理问题用时&#xff0c;提供改善生产管理和人员考核的数据参考&#xff0c;实现透明、快速的生产…

做软件测试,掌握哪些技术才能算作“测试大佬”?

一、过硬的基础能力 其实所有的测试大佬都是从底层基础开始的&#xff0c;随着时间&#xff0c;经验的积累慢慢变成大佬。要想稳扎稳打在测试行业深耕&#xff0c;成为测试大牛&#xff0c;首当其冲的肯定就是拥有过硬的基础&#xff0c;所有的基础都是根基&#xff0c;后期所有…

iOS开发Swift开发UI页面链式调用库推荐

首页链接 https://github.com/zhiguangqiao/ChainableUIKit 安装方法 pod ChainableUIKit调用片段 UIButton import ChainableUIKitprivate let button UIButton().chain.setTitleColor(.init(hex: "#9583EB"), state: .normal).setTitle("全部视频",…

fetch-github-hosts间隔一年大更新v2.6发布,多端支持

前言 fetch-github-hosts是一款同步 github hosts 的工具&#xff0c;用于帮助您解决github时而无法访问的问题。在间隔了一年之久的时间&#xff0c;最近抽空将fetch-github-hosts的依赖及UI进行了一波大更新&#xff0c;同时也增加了一些实用的功能。 主要更新 更新了基础依…

MySQL 视图、索引

视图&#xff1a;根据某个实表查询出来的结果&#xff0c;而生成的一个虚表。 1.视图既然作为一张虚表存在&#xff0c;那么对实表的增删改查操作&#xff0c;视图同样成立。 2.视图既然根据实表得到&#xff0c;那对视图的增删改查操作&#xff0c;也会影响实表。 3.视图在查询…

js ?? || 使用方法

平时很常用的就是||,比如调用接口的时候&#xff0c;接口报错了需要给个默认值 const data(await getData())||{};今天遇到了一个场景&#xff0c;正常后端返回的就是false&#xff0c;如果接口报错要默认设置成true&#xff0c;但如果用了 || &#xff0c;如下&#xff0c;那…