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

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

场景

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

删除时接口参数为明细表的id数组

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

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

思路一:

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

sql 复制代码
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

sql 复制代码
SELECT DISTINCT
    customer_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

sql 复制代码
SELECT DISTINCT
    customer_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

sql 复制代码
SELECT DISTINCT
    t1.customer_id
FROM
    match_detail t1
LEFT JOIN
    match_detail t2 
    ON t1.customer_id = t2.customer_id AND t2.deleted = 0
WHERE
    t1.id IN (1, 2, 3, 4, 6) AND t2.customer_id IS NULL;

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

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

相关推荐
m0_7403524211 小时前
如何在 SvelteKit 中为动态加载的图片实现响应式悬停覆盖层
jvm·数据库·python
今天又在写代码11 小时前
并发问题解决
java·开发语言·数据库
马优晨11 小时前
oracle 的 Schema
数据库·oracle·oracle的schema·数据库的 schema·oracle的schema数据
gmaajt12 小时前
JavaScript中闭包对垃圾回收器GC标记清除算法的影响
jvm·数据库·python
NineData12 小时前
NineData 亮相 2026 德国汉诺威工业博览会,加速拓展欧洲及全球市场
运维·数据库·人工智能·数据库管理·ninedata·ai服务·玖章算术
撩得Android一次心动12 小时前
Android Room 数据库详解【源码篇】
android·数据库·android jetpack·room
m0_4954964112 小时前
C#怎么操作音频文件 C#如何用NAudio播放录制和处理WAV MP3音频文件【工具】
jvm·数据库·python
dFObBIMmai12 小时前
CSS如何检测页面浮动元素位置_使用审查工具与clear
jvm·数据库·python
qq_4609784012 小时前
实现 Svelte 中基于数组索引的 details 元素单开单关交互
jvm·数据库·python
这个DBA有点耶13 小时前
3步抓出慢SQL,别等半夜被叫醒😴
数据库·代码规范