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

SQl中多使用EXISTS导致多查出了一条不符合条件的数据

原本的部分条件如下 


  and i.is_complement = '20'
    and i.yxbz = '1'
  AND (
    i.name LIKE concat ('%', '红', '%')
    OR EXISTS (
      SELECT
        *
      FROM
        commodity_suit_compose csc
      WHERE
        csc.suit_id = i.ID
        AND csc.compose_name LIKE concat ('%', '红', '%')
    )
  )

查寻 i 表的name  和 csc 表中的compose_name,含有"红"这个字的数据,但是查出了一条compose_name不含红字且为空的数据

发现这条 compose_nameNULL!null明明不包含"红" 但是为什么null会被查出来呢,

原本我以为是 compose_name 为 NULL,有些数据库(尤其某些兼容性模式开启时)会 不严格排除 NULL 值条件失效的情况,导致 EXISTS 子查询仍返回了记录 → 主记录被错误保留。

但后面我加了 is not null的条件还是能查出来,但是大概能猜到问题出在EXISTS里面
,最后发现是聚合子查询和EXISTS里面的查询过滤不一致导致的,

我的聚合子查询是这样写的

    (
    SELECT
        string_agg ( compose_name, ',' ) 
    FROM
        (
        SELECT
            compose_name 
        FROM
            commodity_suit_compose csc 
        WHERE
            csc.suit_id = i.ID 
            AND csc.merchant_id = i.merchant_id 
            AND csc.yxbz = '1' 
            AND csc.strike_out = '0' 
        ORDER BY
            csc.num DESC 
        ) AS sorted_names 
    ) "compose_name"

 EXISTS是这样写的

EXISTS (
        SELECT
            * 
        FROM
            commodity_suit_compose csc 
        WHERE
            csc.suit_id = i.ID 
            AND csc.compose_name LIKE concat ( '%', '红', '%' ) 
        ) 

  • 聚合(string_agg)判断存在(EXISTS) 必须在同一个“数据子集”上做过滤,才能保证逻辑一致。

  • 在聚合时只看了“同商家、上架、未删除”的行,却在 EXISTS 里忘了这几条,导致 EXISTS 能拿到一些“被聚合丢掉”的行。

  • 最后给EXISTS加上相同的过滤条件即可

  • EXISTS (
            SELECT
                * 
            FROM
                commodity_suit_compose csc 
            WHERE
                csc.suit_id = i.ID 
                
                AND csc.merchant_id = i.merchant_id 
                AND csc.yxbz = '1' 
                AND csc.strike_out = '0' 
                
                AND csc.compose_name LIKE concat ( '%', '红', '%' ) 
            ) 

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

相关文章:

  • 教程 | 一键批量下载 Dify「Markdown 转 Docx」生成的 Word 文件(附源码)
  • 【Linux】基础开发工具(2)
  • 操作系统面试知识点(1):操作系统基础
  • CyberGlove触觉反馈手套遥操作机器人灵巧手解决方案
  • Kotlin环境搭建与基础语法入门
  • 大厂测开实习和小厂开发实习怎么选
  • 华为云鸿蒙应用入门级开发者认证 实验(HCCDA-HarmonyOS Cloud Apps)
  • linux网络编程socket套接字
  • mysql无法启动的数据库迁移
  • WebSocket 与 HTTP 的区别及 Spring Boot 实战应用
  • [AI]从0到1通过神经网络训练模型
  • 128K 长文本处理实战:腾讯混元 + 云函数 SCF 构建 PDF 摘要生成器
  • C++智能指针概念及std::unique_ptr使用介绍
  • 【办公类-105-01】20250626 托小班报名表-条件格式-判断双胞胎EXCLE
  • CNN不是一个模型?
  • 跨越十年的C++演进:C++14新特性全解析
  • C++(模板与容器)
  • Java--程序控制结构(下)
  • springcloud 尚硅谷 看到9开头
  • NebulaGraph 图数据库介绍
  • 一分钟了解Transformer
  • 缓存与加速技术实践-MongoDB数据库应用
  • AI+时代已至|AI人才到底该如何培育?
  • Python打卡:Day37
  • 快速傅里叶变换(FFT)是什么?
  • 4.2_1朴素模式匹配算法
  • Webshell工具的流量特征分析(菜刀,蚁剑,冰蝎,哥斯拉)
  • LeetCode 2302.统计得分小于K的子数组数目
  • 力扣第45题-跳跃游戏2
  • [mcp-servers] docs | AI客户端-MCP服务器-AI 架构