多条SQL语句对查询结果集的垂直合并,以及表设计时如何冗余字段
需求引入
你有一个销售单表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语句对查询结果集的垂直合并,以及表设计时如何冗余字段的更多相关文章
- 题目:写出一条SQL语句,查询工资高于10000,且与他所在部门的经理年龄相同的职工姓名。
		
create table Emp( eid char(20) primary key, ename char(20), age integer check (age > 0), did char ...
 - SQL语句关联查询
		
一:连接类型: 关联查询:只有存在关联的表才能关联查询,完全独立的表之间无法关联 1.关联的类型:自关联,左关联,右关联,全关联(full join)两张表都是主表 2.关联的表:两张以上,以一张(或 ...
 - Jmeter的JDBC请求执行多条SQL语句
		
注:有mysqlconnector/j 3.1.1以上版本才支持执行多条sql语句 1. 下载jdbc驱动为了连接Mysql数据库,还需要有个jdbc驱动:mysql-connector-ja ...
 - 使用传入的总记录数实现一条sql语句完成分页查询
		
使用传入的总记录数实现一条sql语句完成分页查询 问题:在传统的分页查询的实现中不可避免的需要两条sql语句,一条用于查询数据一条用于查询总记录数.如下面的实际代码所示: Img1 当然如果使 ...
 - SQL反模式学习笔记18  减少SQL查询数据,避免使用一条SQL语句解决复杂问题
		
目标:减少SQL查询数据,避免使用一条SQL语句解决复杂问题 反模式:视图使用一步操作,单个SQL语句解决复杂问题 使用一个查询来获得所有结果的最常见后果就是产生了一个笛卡尔积.导致查询性能降低. 如 ...
 - 关联映射、关联查询【重点掌握一条SQL语句的那种方法】
		
1 什么叫关联映射 通过数据库对象之间的关联关系(一对一.一对多.多对多),反映到实体对象上之间的引用. 举例 用户实体类(User):user_id user_name user_token 笔记本 ...
 - 转:ibatis常用16条SQL语句
		
1.输入参数为单个值 <delete id="com.fashionfree.stat.accesslog.deleteMemberAccessLogsBefore" par ...
 - 一条SQL语句在MySQL中如何执行的
		
本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的. 在分析之前我会先带着你看看 MySQL 的基础架构, ...
 - mysql -- 一次执行多条sql语句
		
最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.s ...
 
随机推荐
- 5个数组Array方法: indexOf、filter、forEach、map、reduce使用实例
			
ES5中,一共有9个Array方法 Array.prototype.indexOf Array.prototype.lastIndexOf Array.prototype.every Array.pr ...
 - 爬取qq号
			
import reimport urllib.requestimport osimport jsonimport sslfrom collections import deque #把爬去的数据保存到 ...
 - 微信小程序上拉下拉刷新
			
小程序提供了,onPullDownRefresh和onReachBottom两个事件函数监听下拉和上拉事件函数.提示加载中,取消加载中 效果: js文件 // pages/enterprise/ent ...
 - 一个c程序反汇编过程(zz)
			
zz from http://blog.luoyuanhang.com/ 最基本的反汇编方法是gdb xxx: disassemble main/其他函数 #反汇编一个简单的C程序并分析 C 源码: ...
 - centos 上docker 运行出现/bin/sh: . not found
			
本人用的是Linux上的编译的....然后用了win上的编译命令 解决办法 : 用Linux上的编译命令..... CGO_ENABLED=0 GOOS=linux GOARCH=amd64 g ...
 - HTML5新规范和CSS3新特性
			
1.HTML5最新规范(HTML5是HTML.XHTML以及HTML.DOM的新标准) ①用于绘画canvas元素 ②用于媒介回放的video和audio元素 ③对本地离线存储的更好支持 ④新的特俗内 ...
 - Vue 制作简易计算器
			
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
 - Moving or disabling the package cache for Visual Studio 2017
			
Moving or disabling the package cache for Visual Studio 2017 | Setup & Install by Heath Stewart ...
 - session实现原理(阿里面试题)
			
问: 当用户登录某网站后,向服务器发送一个请求,服务器如何判断是这个用户请求的 首先,你要明白一点,最初http协议在设计的时候,主要面向当时的web1.0网站,他们不需要知道是谁来访问,只需要向外界 ...
 - log4j-日志记录小结
			
log4j.properties配置 ### 以系统输出流的方式按照指定的格式在控制台上输出日志信息 ###log4j.appender.stdout=org.apache.log4j.Console ...