一、需求背景
业务机构下销售商品,同个业务机构可以销售不同的商品,同个商品可以在不同的业务机构销售,也就说:业务机构与商品是多对多的关系

假设现在有 n 个机构,每个机构下有几个商品,如何查询出这几个门店下各自商品的销售情况?

具体点,类似如下
  
如何查出 100001 下商品 1000、1001、1003 、 100002 下商品 1003、1004 、 100003 下商品 1006、1008、1009 的销售情况

相当于是双层列表(业务机构列表中套商品列表)的查询;业务机构列表和商品列表都不是固定的,而是动态的

那么问题就是:如何查询多个业务机构下,某些商品的销售情况

二、循环查询
这个很容易想到,在代码层面循环业务机构列表,每个业务机构查一次数据库,伪代码如下:

具体的 SQL 类似如下

SQL 能走索引

实现简单,也好理解,SQL 也能走索引,一切看起来似乎很完美

然而现实是:部门开发规范约束,不能循环查数据库

哦豁,这种方式只能放弃,另寻其他方式了

三、OR 拼接
通过 MyBatis 的 动态 SQL 功能,进行 SQL 拼接,类似如下

 具体的 SQL 类似如下
 
SQL 也能走索引

实现简单,也好理解,SQL 也能走索引,而且只查询一次数据库,貌似可行

唯一可惜的是:有点费 OR,如果业务机构比较多,那 SQL 会比较长

作为候选人之一吧,我们接着往下看

四、混查过滤
同样是利用 Mybatis 的 动态 SQL ,将 business_id 列表拼在一起、 ware_inside_code 拼在一起,类似如下

具体的 SQL 类似如下

SQL 也能走索引

实现简单,也好理解,SQL 也能走索引,而且只查询一次数据库,似乎可行

但是:查出来的结果集大于等于我们想要的结果集,你品,你细品!

所以还需要对查出来的结果集进行一次过滤,过滤出我们想要的结果集

姑且也作为候选人之一吧,我们继续往下看

四、行行比较

SQL-92 中加入了行与行比较的功能,这样一来,比较谓词 = 、< 、> 和 IN 谓词的参数就不再只是标量值了,还可以是值列表了

当然,还是得用到 Mybatis 的 动态 SQL ,类似如下

具体的 SQL 类似如下

SQL 同样能走索引


实现简单,SQL 也能走索引,而且只查询一次数据库,感觉可行

只是:有点不好理解,因为我们平时这么用的少,所以这种写法看起来很陌生

另外,行行比较是 SQL 规范,不是某个关系型数据库的规范,也就说关系型数据库都应该支持这种写法

五、总结

1、最后选择了 行行比较 这种方式来实现了需求

别问我为什么,问就是逼格高!

2、某一个需求的实现往往有很多种方式,我们需要结合业务以及各种约束综合考虑,选择最合适的那个

3、行行比较是 SQL-92 中引入的,SQL-92 是 1992 年制定的规范

行行比较不是新特性,而是很早就存在的基础功能!

SQL语句-行行比较相关推荐

  1. C#使用SQL语句时候的万用密码问题

    实际上万用密码就是因为SQL里面的语句--是注释,利用bug添加用户名和密码. 例如,用户名为 adada' or 1=1-- 第一个种写法登录成功了 第二种写法登录失败(正确) 第三种写法登录失败( ...

  2. navicat循环执行上下两行相减sql语句_SQL语句的优化分析

    一.开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应 ...

  3. 数据存取演变史、数据库软件应用史、数据库的本质、分类、 MySQL数据库、系统服务制作、基本的SQL语句

    数据存取演变史 1.文本文件 文本文件有两个主要的缺点:第一个就是不能保证多用户存取的文件路径一致:第二个就是不能保证多用户存取的数据格式一致 2.软件开发目录规范 软件开发目录规范规定了数据文件的大 ...

  4. 逆袭之路——python 数据发展史、MySQL的下载和安装、基本SQL语句【day45】

    今日内容概要 数据演变史 存取发展史 数据库本质 数据库分类 SQL与NoSQL MySQL下载与安装 系统服务制作 重要概念 基本SQL语句 今日内容详细 一.数据演变史 单独的文本文件 没有固定的 ...

  5. SQL优化篇:如何成为一位写优质SQL语句的绝顶高手!

    写SQL语句不难,稍微系统学习过数据库相关技术的人都能做到,但想要写好SQL却也不是一件易事,在大多数编写SQL的时候,很多人都是以实现需求为原则去撰写的,当一条SQL写出来之后,只要能满足业务需求就 ...

  6. SQL语句优化——结合书籍论坛小结

    刚开始碰到一个旧系统里面的一条SQL语句,查询要200多秒,一看就是left join了很多表,并且索引使用有问题,条件连表之后再判断等问题.通过查看了mysql高性能和mysql语句优化书籍和论坛做 ...

  7. Oracle数据库SQL语句(四)—子查询(嵌套查询)

    Oracle数据库SQL语句(四) 子查询(嵌套查询) 1.单行子查询 SELECT * FROM stuWHERE ID > (SELECT ID FROM stu WHERE NAME =' ...

  8. MySQL的基础架构以及一条查询sql语句的执行流程

    详细介绍了Mysql的基础架构以及一条查询sql的执行流程. 如果不想作为一个只能简单的写写sql工程师,而是想要深入的学习MySQL,那么我们有必要首先从宏观的角度来了解MySQL的整体架构,只有把 ...

  9. oracle 行转列sql语句,行转列(sql行转列)

    sql语句行转列?怎么转啊 select MIN(id) as ID, name, sex, sum(case when num=2 then 2 end) as num2, sum(case whe ...

最新文章

  1. SVG和canvas
  2. html5 jquery版工作流设计器,基于jQuery的web在线流程图设计器GooFlow
  3. 阿里开源台柱 Ant Design 源码仓库被删了...
  4. Linux Qt打包发布应用程序
  5. [Leetcode][第459题][JAVA][重复的字符串][子串][匹配]
  6. [wxWidget系列] wxWidget的事件机制
  7. 爆炸性环境设备通用要求标准_防爆电气设备的适用环境及温度要求
  8. Docker实践 -- 安装Docker
  9. php中的正则表达式相关例题,实例学习PHP中的正则表达式
  10. Hibernate之复合主键映射
  11. python-excel读取代码1
  12. JVM内存模型及垃圾回收机制
  13. 通过Python对商品销售数据预测
  14. FAT学习笔记(四)——Dir Entry
  15. 投影幕布尺寸计算器_投影距离和屏幕尺寸计算器
  16. zencart iis 伪静态设置 测试可用
  17. hevc_nvenc 详细分析1
  18. 新买的显示器怎么测试软件,新买的电视如何检测屏幕?记住这个方法
  19. android开发之背景音乐与音效
  20. 大数据的五大关键技术

热门文章

  1. 活动表现形式与特点【运营】
  2. c语言鹏哥学习笔记(分支与循环)
  3. ossim5.0安装
  4. 如何在微信公众号编辑器发布免费好看的排版内容
  5. 数据分析方法:对比与对标
  6. 《龙族幻想》手游上线,网友:排队1小时,捏脸5分钟?
  7. ToF传感器究竟有多神奇?本文告诉你!
  8. 大疆无人机 MobileSDK(遥控器/手机端)开发 v5版<2>
  9. 2023年团体程序设计天梯赛(含部分题解)
  10. 电梯控制算法(8)多电梯场景——双电梯的空闲停靠