需求引入

你有一个销售单表A 和一个销售单详情表B 和一个收付款记录表C

A---->B 一对多   A---->C一对多

如果一个销售单有两个详情,三条收款记录

对一个销售单 我们想查询出一个结果集 有销售单的id、详情总额、销售单的收款总额

如果你select A  join B on(B和A的外键) 查询出2条记录结果集

如果你select A  join C on(C和A的外键) 查询出3条记录结果集

那你 如果你select A  join B on(B和A的外键)  join C on(C和A的外键) 查询出2*3=6条记录结果集 然后在sum

如果select语句中有聚合函数(sum count )很可能导致查询的结果不符合需求的要求。因为详情总额只需要对两条记录进行sum  收款进行需要三条 而sum之前我们查出来了六条

解决办法

1. 用两条sql查询 然后通过java对结果集进行合并。

缺点:只能对一些简单的需求,如果多个销售单,还要做分页 而且有 付款记录和详情的搜索条件 JAVA很难做

2. 用两条sql查询  然后就是用sql的垂直合并了

select * from (sql1)  join (sql2) on(sql1.销售单的主键=sql2.销售单的主键) 就是把两条sql当成两个子查询

优点:解决了用java操作List进行合并,做不了分页搜索的问题。因为我们用的一个SQL 无论需求怎么搜索分页,都可以搞定

工作中做某张报表的时候发现的。sql语句含有多个一对多关系的时候 注意影响聚合函数的结果。所以采用了先拆分sql,然后根据需求垂直合并。

设计表结构的时,如何避免出现过长的SQL查询

冗余一些字段,比如你需要对收付款记录的某一个字段(比如金额)做sum 把这个字段冗余到一张额外的表里面。

方法一:每次进行收付款的时候加减这个字段。这样做报表的时候就不必再关联收付款记录表做关联求sum了(这样的话 有哪个接口忘记更新收付款就完蛋了 很难排查)

方法二 :每次进行收付款的时候 从新进行一遍收付款的sum放进销售单里面,比较消耗性能。引入消息队列 异步的操作这种接口。

方法三  :收付款的时候多开一个线程,去更新sum字段

当我们把计算逻辑(比如钱的增量)写在SQL里面的时候 可以不用乐观锁,因为SQL会读到其他已经提交的事物,但是如果这个钱是先计算好,然后直接update的 需要用乐观锁

多条SQL语句对查询结果集的垂直合并,以及表设计时如何冗余字段的更多相关文章

  1. 题目:写出一条SQL语句,查询工资高于10000,且与他所在部门的经理年龄相同的职工姓名。

    create table Emp( eid char(20) primary key, ename char(20), age integer check (age > 0), did char ...

  2. SQL语句关联查询

    一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...

  3. Jmeter的JDBC请求执行多条SQL语句

    注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1.     下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...

  4. 使用传入的总记录数实现一条sql语句完成分页查询

    使用传入的总记录数实现一条sql语句完成分页查询     问题:在传统的分页查询的实现中不可避免的需要两条sql语句,一条用于查询数据一条用于查询总记录数.如下面的实际代码所示: Img1 当然如果使 ...

  5. SQL反模式学习笔记18 减少SQL查询数据,避免使用一条SQL语句解决复杂问题

    目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...

  6. 关联映射、关联查询【重点掌握一条SQL语句的那种方法】

    1 什么叫关联映射 通过数据库对象之间的关联关系(一对一.一对多.多对多),反映到实体对象上之间的引用. 举例 用户实体类(User):user_id user_name user_token 笔记本 ...

  7. 转:ibatis常用16条SQL语句

    1.输入参数为单个值 <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" par ...

  8. 一条SQL语句在MySQL中如何执行的

    本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...

  9. mysql -- 一次执行多条sql语句

    最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...

随机推荐

  1. bhttpd

    以前产品应用是用串口做控制台,写了一个带简单命令历史和命令补全功能的控制台Shell,用作程序的调试,包括查看系统状态和调试修改设定等等.确实非常好用,对很多现场简单问题的快速定位起到了很好的作用.系 ...

  2. 炫酷MD风之dialog各种对话框

    这个demo也是我从别人那里学来的,不是本人写的代码,我也是个MD初学者.把这个demo分享给看到的你,希望对你有帮助. 直接上图: demo地址:百度网盘:链接:https://pan.baidu. ...

  3. MyEclipse 编译错误 web项目中的 js,jsp报错 更改

    搜索   validation   语法检测 必须 选定一个  不然不编译

  4. 3D Graph Neural Networks for RGBD Semantic Segmentation

    3D Graph Neural Networks for RGBD Semantic Segmentation 原文章:https://www.yuque.com/lart/papers/wmu47a ...

  5. Linux初次修改环境变量

    对于刚刚从windows系统跳到Linux的小白们,相信多少都会出现一些强迫症,希望能将Linux的Terminal能调出点色彩,让其好看些.之前自己也不知道怎么按着百度的教程操作完成的,直到组里新来 ...

  6. centos vi设置tab为4个空格 和括号自动补全

    1.打开vim配置文件 vi /etc/vimrc 2.设置tab为4个空格, 在文件末尾添加以下内容 if has( "autocmd" ) filetype plugin in ...

  7. CentOS升级OpenSSL至OpenSSL 1.1.0f版本<其中有遇到libcrypto.so的问题>

    概述: 整体步骤如下: 1.先检查版本 2.进行安装 <安装采用源码安装,然后再做相关的链接指向> 一.检查当前环境 1. 查看当前版本 openssl version 或者使用 yum ...

  8. What is REST API

    What is REST REST is acronym for REpresentational State Transfer. It is architectural style for dist ...

  9. 常用JSON接口

    地图接口阿里云根据地区名获取经纬度接口http://gc.ditu.aliyun.com/geocoding?a=苏州市 官方文档参数解释: 纬度,经度 type 001 (100代表道路,010代表 ...

  10. 得到一个文件夹中所有文件的名称的几个方法(命令指示符, C++, python)

    因为最近一直需要获得一个文件下的所有图片的名称,自己又总是跨平台使用,所以把自己在不同环境之下使用的方法总结如下 1.cmd 模式下 优点:简单 例如,我想将一个文件夹下的所有".jpg&q ...