当前位置: 首页 > news >正文

记录一次业务遇到的sql问题

刚开始工作 业务能力比较薄弱 记录一下这几天遇见的一个业务问题

场景

先简单说一下场景,有一批客户(一张表),可以根据这个客户匹配出很多明细数据(另一张表),现在需要删除明细,一个客户可以匹配出很多的明细数据,在删除的时候如果某个客户的明细数据全部删除了,就删除这个客户。
删除时接口参数为明细表的id数组

明细表中字段有 id、customer_id、deleted 这三个字段(其他忽略)。

怎么直接写一个sql的到需要删除的客户id

思路一:

首先根据id查到客户id,在查到还有明细数据的客户id,吧这些id剔除掉就是需要删除的客户id

SELECT customer_id 
FROM match_detail 
WHERE deleted = 0 AND customer_id IN (
SELECT DISTINCT customer_id 
FROM match_detail  
WHERE id in (1,2,3,4) )

然后在代码中剔除掉就可以了。

思路二

第一种当然可以 但是能直接查出来需要删除的客户id更好,既然如此直接NOT IN 不就好了

大家可以想一下SQL应该怎么写。

我的想法是直接先查出来所有的客户id,然后查出有明细的客户ID,然后拿全量的客户ID NOT IN 一下不就行了。
这是我写出来下面的SQL

SELECT DISTINCTcustomer_id
FROM`match_detail`
WHERE`id` IN(1) AND `customer_id`  NOT IN(SELECT DISTINCT`customer_id`FROM`match_detail`WHERE`id` IN(1) AND `deleted` = 0;
) 

大家看一下这个SQL有什么问题吗?
很明细这个SQL有个问题子查询永远不会有值,因为根据id已经删除过了,还要满足未删除,那么这个sql会查处所有的客户id

所以肯定是不满足的。

知道了问题在哪,那么是不是子查询的条件应该是找到所有客户id的明细数据。所以有了以下的SQL

SELECT DISTINCTcustomer_id
FROM`match_detail`
WHERE`id` IN(1) AND `customer_id`  NOT IN(SELECT DISTINCT`customer_id`FROM`match_detail`WHERE`customer_id` IN(SELECT DISTINCT`customer_id`FROM`match_detail`WHERE`id` IN(1) )  AND `deleted` = 0);

这个SQL经过验证是符合要求的,然后经过优化,又有了下面的SQL

SELECT DISTINCTt1.customer_id
FROMmatch_detail t1
LEFT JOINmatch_detail t2 ON t1.customer_id = t2.customer_id AND t2.deleted = 0
WHEREt1.id IN (1, 2, 3, 4, 6) AND t2.customer_id IS NULL;

这也算是一次踩坑吧,每一次踩坑都是一次进步,虽然很简单,但是过程中也会遇到考虑不到的点。

有什么问题,或者大家有什么好的解决思路。欢迎指正,一起学习。

http://www.lryc.cn/news/319493.html

相关文章:

  • 代码分支管理
  • uniapp sqlite时在无法读取到已准备好数据的db文件中的数据
  • 源码编译部署LAMP
  • Echo框架:高性能的Golang Web框架
  • 数据结构--七大排序算法(更新ing)
  • 202203青少年软件编程(图形化) 等级考试试卷(二级)
  • 【智能硬件、大模型、LLM 智能音箱】Emo:基于树莓派 4B DIY 能笑会动的桌面机器人
  • rust学习笔记(1-7)
  • vscode jupyter 如何关闭声音
  • plt保存PDF矢量文件中嵌入可编辑字体(可illustrator编辑)
  • Nacos与Eureka的使用与区别
  • 利用express从0到1搭建后端服务
  • 如何在Ubuntu中查看编辑lvgl的demo和examples?
  • 深入了解 大语言模型(LLM)微调方法
  • C语言之快速排序
  • 获取扇区航班数
  • ​【已解决】npm install​卡主不动的情况
  • Golang协程详解
  • git:码云仓库提交以及Spring项目创建
  • 【Miniconda】基于conda避免运行多个PyTorch项目时发生版本冲突
  • 【机器学习-02】矩阵基础运算---numpy操作
  • 《A Second-Order PHD Filter With Mean and Variance in Target Number》学习心得
  • React 实现下拉刷新效果
  • 使用endnote插入引用文献导致word英文和数字变成符号的解决方案
  • npm下载慢换国内镜像地址
  • 开源绘图工具 PlantUML 入门教程(常用于画类图、用例图、时序图等)
  • Ubuntu20下C/C++编程开启TCP KeepAlive
  • 前世档案(不用二叉树语法秒杀版c++)
  • Java基础 - 9 - 集合进阶(二)
  • javaEE——线程的等待和结束