看似简单的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,一经查实,立即删除!

相关文章

机器学习方法

机器学习是人工智能(AI)的一个分支,它使计算机系统能够从数据中学习并改进其性能,而无需进行明确的编程。机器学习的核心是开发算法,这些算法可以从大量数据中识别模式,并用这些模式来做出预测或决策&#…

MySQL数据库的备份

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

Javascript中的严格模式 “use strict“

一、为什么使用严格模式? 在普通的 JavaScript 中,写错变量名会创建新的全局变量, 在严格模式中,写错变量名会抛出错误来提醒开发者 二、声明严格模式 通过在脚本或函数的开头添加 “use strict”; 来声明严格模式。"use …

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

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

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

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

Rancher(v2.6.3)——Rancher部署Nacos(单机版)

Rancher部署Nacos详细说明文档:https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#5rancher%E9%83%A8%E7%BD%B2nacos ps:如果觉得作者写的还行,能够满足您的需求&#x…

Android AIDL编译 程序包 .aidl 不存在

错误: 程序包 aidl 不存在 本文仅针对 AGP 8.0 android gradle plugin 以上 buildFeatures {aidl true } 在模块gradle android { }中增加. 详见: https://developer.android.com/build/releases/past-releases/agp-8-0-0-release-notes?hlzh-cn#default-changes

什么是进程

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

面试算法-110-课程表

题目 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出,其中 prerequisites[i] [ai, bi] ,表示如果要学习课程 ai 则 必须 先学习课程 bi 。 …

【分布式websocket】表情怎么做?自制表情包和Unicode表情符号区别?表情编解码?【20期】

前言 表情包是聊天系统中一个比较常见的功能。常见的表情表分为两种是类型。 一种是Unicode表情,另外一种是图片表情。我们这篇文章两种都会涉及。 图片类表情包会涉及到编解码。不会将发送消息的图片的url地址也一并存入数据库中。 文章将会从表情分类。表情编解码…

添加网址到主页

基于localStorage的网址收藏夹-CSDN博客 为了通过安卓菜单添加网址到主页中,调试了几个小时,主要踩了几个坑。 1.localStorage 通过域名隔离,需要加载主页才能读写。 2.WebView 可以不显示,但是 JS 代码要放在 window.onload 中…

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/客户端查看 首先我们打开服务器此电脑 建立一个文件夹 右击文件夹点击属…

node整理学习(二)

模块化的概念 一、什么是模块化 模块化是指解决一个复杂问题时,自顶向下逐层把系统划分成若干模块的过程,模块是可组合、分解和更换的单元 二、模块化的好处 1、提高了代码的复用性 2、提高了代码的可维护性 3、可以实现按需加载 三、模块化规范 …

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渲染需要的所有信息和状态,可以把上下文理解成一个大的结构体,它里面记录了当前绘制使…

C#.NET 与 Python 交互

若你要用.NET和Python交互,那么你可以使用两种技术:IronPython 和 Python.NET 。 但两者的基础实现和目标场景都不同,因此如何使用它们也有所不同。 IrconPython简称 IPy , Python.NET 也叫 pythonnet 或 Python for .NET ,下面分…