反向like,在使用EXISTS关键字时遇到的问题

本人刚刚上岗开发,这个问题对大佬们来说可能不是事,但确实困扰我好久。

需求

一个查询 1.查询条件有金额(F_JE)的范围查找,F_FXZBBH等。 2.要求根据组织机构(F_ZZJG)分级展示,如果下级组织机构满足条件,则也要把所有上级组织机构展示出来。 3.表的主键为F_FXZBBH和F_ZZJG。

根据以上条件写出sql:

sql 复制代码
SELECT F_FXZBBH,F_FXZBMC,F_ZZJG,F_JE FROM TABLEXX A 
WHERE 1=1  
AND F_FXZBBH = '001000100010' 
AND EXISTS  (SELECT 1 FROM TABLEXX B WHERE  B.F_ZZJG LIKE A.F_ZZJG||'%'  AND F_JE >= 1 AND F_JE <= 61590) 

测试时发现问题

出现了一条金额为0的最下级组织机构的数据。数据库里有好多金额为0的数据,但此处别的都没有出现,只出现了F_ZZJG为100016001000100的这一条

经过不断测试,我发现当sql里的条件F_JE >= 1 改为F_JE >=50013 时,就不会再有F_ZZJG为100016001000100的这一条数据了。当F_JE >=50012时,就会出现这一条数据。于是我去数据库里查找F_ZZJG为100016001000100对应的数据

发现问题,因为表的主键为F_FXZBBH和F_ZZJG。F_ZZJG为100016001000100对应了两条数据 其中一条满足了 F_JE >= 1 AND F_JE <= 61590 所以根据EXISTS,把它及它所有上级的数据都查出来了,此时的F_ZZJG为100016001000100和它所有上级其实都是被查出来F_FXZBBH不同的两条数据的,但EXISTS外又限制了F_FXZBBH = '001000100010',所以JE为50012的那几条数据被过滤了,只剩下满足*F_FXZBBH = '001000100010'*金额为0的数据了。

解决方案

sql 复制代码
SELECT F_FXZBBH,F_FXZBMC,F_ZZJG,F_JE FROM TABLEXX A 
WHERE 1=1  
AND F_FXZBBH = '001000100010' 
AND EXISTS  (SELECT 1 FROM TABLEXX B WHERE A.F_FXZBBH=B.F_FXZBBH AND B.F_ZZJG LIKE A.F_ZZJG||'%'  AND F_JE >= 1 AND F_JE <= 61590) 

在EXISTS中添加A.F_FXZBBH=B.F_FXZBBH

结论

在EXISTS关键字中的WHERE条件中,务必根据唯一性约束,将所有用于确定唯一性的条件都关联上。

相关推荐
2501_9336707913 小时前
2027届大数据管理与应用求职数字化转型顾问:项目、SQL、业务理解怎么排优先级
数据库·sql
资深技术分享员15 小时前
Geejing WebBuilder 数据库连接配置与在线 SQL 工具,运维的左右手
运维·数据库·sql·低代码
做运维的阿瑞16 小时前
一个 NULL 让整列姓名消失?MySQL 字符串与日期函数复盘
数据库·sql·mysql
阳光九叶草LXGZXJ17 小时前
达梦数据库-学习-69-DM9主备集群部署
linux·运维·服务器·数据库·sql·学习
在猴站学算法17 小时前
(SQL注入学习)联合查询注入(UNION-Based)
sql·学习·网络安全
小小龙学IT18 小时前
Go 语言 database/sql 标准库深度解析:从连接池到驱动抽象
数据库·sql·golang
Seraphina3618 小时前
SQL注入(一)
数据库·经验分享·笔记·sql·网络安全
白帽攻防录1 天前
SRC 挖洞:Roundcube 预认证 SQL 注入深度复盘,CVE-2026-48842 preg_replace 转义绕过怎么打穿邮件系统
网络·数据库·sql·网络安全·sql注入
꯭自꯭闭꯭1 天前
达梦SQL优化相关
linux·运维·数据库·sql
杨云龙UP2 天前
一次数据库查询缓慢故障复盘:大表数据增长、SQL全表扫描导致系统响应异常
linux·运维·服务器·数据库·sql·mysql