看似简单的SQL,实则就是简单

加班遇到一个SQL问题,本想把别人的SQL改下成SparkSQL,在YARN上运行,然而数据一直对不上。

原SQL

⚠️说明:a.id,b.id没有空的,数据1:1,b.name可能存在空的

select a.id,b.id,b.name
from table_a a 
left join table_b b on a.id = b.id and b.is_delete = 0 and b.name is not null
where 
exists(select 1 from  table_b c where a.id = c.id and c.is_delete = 0
)

改后的

想法是:既然exists过滤了,为什么不直接inner join呢,于是乎:

select a.id,b.id,b.name
from table_a a 
inner join table_b b on a.id = b.id and b.is_delete = 0  

求助群友

问了下群友,区别是我一直以为left join 后 b.name is not null并没什么用,就没有带,我问群友,下面这两个SQL有什么区别:

select *
from table_a a 
left join table_b b on a.id = b.id and b.is_delete = 0 
where 
exists(select 1 from  table_b c where a.id = c.id and c.is_delete = 0
)select *
from table_a a 
inner join table_b b on a.id = b.id and b.is_delete = 0  

群友问AI的结果

这样的回答,不太对

自悟

然后仔细去品味这两个SQL有什么不同

-- (1)
select a.id,b.id,b.name
from table_a a 
left join table_b b on a.id = b.id and b.is_delete = 0 and b.name is not null
where 
exists(select 1 from  table_b c where a.id = c.id and c.is_delete = 0
)-- (2)select a.id,b.id,b.name
from table_a a 
inner join table_b b on a.id = b.id and b.is_delete = 0  

数据table_a

id

1

2

3

数据table_b

id

name

id_delete

1

aa

0

2

bb

0

3

NULL

0

结论:

(1)sql计算后的会剔除掉 table_a 不符合 a.id = c.id and c.is_delete = 0 条件的数据。加上 name is not null。最后的数据会出现这两类情况:

a.id,null,null   # name为null,b表全部为空
a.id,b.id,b.name # 全部有值

a.id

b.id

b.name

1

1

aa

2

2

bb

3

NULL

NULL

(2)sql计算后中则会出现这两类情况:

a.id,b.id,null   
a.id,b.id,b.name # 全部有值

a.id

b.id

b.name

1

1

aa

2

2

bb

3

3

NULL

所以,count的时候是没有问题的,两个都可以,如果是取具体的值有所区别。

拓展

如果a.id b.id 是1:n 呢?

数据table_a

id

1

2

3

10

数据table_b

id

name

id_delete

1

aa

0

1

NULL

0

2

bb

0

3

NULL

0

-- (1)
select a.id,b.id,b.name
from table_a a 
left join table_b b on a.id = b.id and b.is_delete = 0 and b.name is not null
where 
exists(select 1 from  table_b c where a.id = c.id and c.is_delete = 0
)

a.id

b.id

b.name

1

1

aa

2

2

bb

3

NULL

NULL

-- (2)select a.id,b.id,b.name
from table_a a 
inner join table_b b on a.id = b.id and b.is_delete = 0 

a.id

b.id

b.name

1

1

aa

1

1

NULL

2

2

bb

3

3

NULL

所以,如果count的时候,1对n,相对于1:1是有区别的。

最后

(1)菜就要学,就要钻研。

(2)加班使人头疼,头脑不灵光。

(3)具体问题,具体分析。

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

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

相关文章

MySQL数据库的备份

文章目录 MySQL数据库的备份MySQL备份方法完全备份物理备份备份 逻辑热备完全备份逻辑热备恢复恢复库恢复表 增量备份备份增量备份恢复基于位置进行恢复基于时间 MySQL数据库的备份 MySQL备份方法 物理备份: 物理备份涉及直接复制MySQL的数据文件和日志文件。这种…

FANUC机器人某个轴编码器损坏时进行单轴零点标定的具体方法

FANUC机器人某个轴编码器损坏时进行单轴零点标定的具体方法 前提: FANUC机器人编码器或其线路有损坏,一般先将机器人移动至零点位置,编码器相关部件更换完毕后,直接进行零点标定即可。但是对于突发的状况,这种方法显然是不行的,比如在生产过程中突然发生碰撞导致编码器相…

暴雨讲堂:AI时代第五代英特尔CPU能做什么?

如果把科技圈比作娱乐圈,那么这两年的顶流一定是AI。2023年,世人见证了ChatGPT在全球范围内的大火,以生成式AI为代表的新一轮人工智能应用问世,改变了人工智能(AI)技术与应用的发展轨迹,并开始在…

什么是进程

目录 一. 进程的概念二. 进程的组成三. 进程的特征四. 进程的状态与转换4.1 进程的状态4.2 进程状态的转换4.3 进程的组织方式 五. 进程控制5.1 进程控制5.2 进程创建 六. 进程之间的通信6.1 共享存储6.2 消息传递 \quad 一. 进程的概念 \quad 思考:操作系统是这些进程的管理者…

oracle19c单机版补丁19.3.0.0升级到19.22.0.0

oracle19c单机版补丁升级到19.22.0.0 一、获取补丁包 查看之前的版本 column product format A30 column version format A15 column version_full format A20 column status format A15 select * from product_component_version;二、备份opatch和数据库文件 su - oracle …

封装-练习

T2、以面向对象的思想,编写自定义类描述IT从业者。设定属性包括:姓名,年龄,技术方向,工作年限;方法包括:工作。 要求: 设置属性的私有访问权限,通过公有的get,set方法实现…

AD域的使用

一,部署共享网络驱动器 1/根目录下创建共享资料库-共享 2/用户-首选项-windows设置-网络驱动器-新建-映射驱动器 3/创建-共享路径-驱动器号(可固定/可随机) 4/更新策略:gpupdate /force 5/客户端查看 首先我们打开服务器此电脑 建立一个文件夹 右击文件夹点击属…

Avalonia(11.0.2)+.NET6 打包设置发布包的版本号

Avalonia11.0.2+.NET6 打包设置发布包的版本号 系统版本如何打包设置打包的版本号本文是对上一篇打包文章的补充,后台好多人私信我说打包的版本号如何设置,今天出个补充说明 Avalonia(11.0.2)+.NET6 打包运行到银河麒麟V10桌面系统 系统版本 如何打包 Avalonia(11.0.2)+.NET…

MVC与MVVM:两种前端架构模式对比

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

pytest教程-19-pytest.ini配置文件

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest内置fixture的使用方法,本小节我们讲解一下pytest.ini文件的配置方法。 pytest配置文件可以改变pytest的运行方式,它是一个固定的文件pytest.ini文件&#xff0c…

OpenGL学习笔记【4】——创建窗口,给窗口添加渲染颜色

一、前三章节的前情回顾 章节一:上下文(Context) OpenGL学习笔记【1】——简介-CSDN博客 章节一讲述了OpenGL在渲染的时候需要一个Context来记录了OpenGL渲染需要的所有信息和状态,可以把上下文理解成一个大的结构体,它里面记录了当前绘制使…

基于Java校园跑腿管理系统设计与实现(源码+部署文档)

博主介绍: ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到 Java项目精品实…

自定义collate_fn函数:应对报错RuntimeError: stack expects each tensor to be equal size

使用BERT或ResNet分别生成文本和图像特征时,由于文本自身长度和图像大小的限制,导致最后形成的特征数据在送入DataLoader时会因为维度不同而报错: RuntimeError: stack expects each tensor to be equal size此时就需要自定义collate_fn函数实现数据的自定义加载功能,下面…

类型双关联合体(C++基础)

类型双关 类型双关就是在同样的一个内存中,存储的数据可以用做不同类型的表述。用在底层性能优化的时候,一般使用的时候要非常小心,因为不当的使用可能导致程序的不稳定和不可预测的行为。 int a 5;//double value (double)a;double value…

软考信息系统项目管理师2024上半年报名流程及注意事项

2024年5月软考信息系统项目管理师报名入口: 中国计算机技术职业资格网(http://www.ruankao.org.cn/) 2024年软考报名时间暂未公布,考试时间上半年为5月25日到28日,下半年考试时间为11月9日到12日。不想错过考试最新消…

Qt Design Studio 软件怎么用(详细+通俗+有趣)

建议:本文长期更新,建议点赞/收藏! 1. 啥是Qt Design Studio? Qt Design Studio 是一个用于设计和开发用户界面的工具,特别适合开发跨平台应用程序。它结合了UI设计和开发的工作流程,使得设计师和开发者可…

桌面显示器PD芯片:引领桌面显示技术的新篇章

随着科技的飞速发展,桌面显示器作为人们日常工作与生活中不可或缺的重要设备,其性能与品质也在不断提升。其中,PD芯片作为桌面显示器中的核心组件,发挥着至关重要的作用。本文将对桌面显示器PD芯片进行详细介绍,探讨其…

【Leetcode】top 100 二叉树

基础知识补充 完全二叉树:顺序存储(数组) 非根节点的父节点序号floor((i-1)/2) 序号i的左孩子节点序号2*i1 右孩子节点序号2*i2 一般二叉树:链式存储 结构:left指针指向左子节点,right指针指向右子节点&am…

ffmpeg拉流并解码

流程 注意事项 版本不同导致的api差异资源安全释放