多条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字段
- 传值设置mybatis查询的 列名(字段名),以及如何查看mybatis中执行的SQL语句
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。【转】
- 不同数据库sql查询表字段以及结构的语句
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案
- oracle 中查询一个表的所有字段名以及属性的sql语句应该怎么写?
- 一个表里有多个字段需要同时使用字典表进行关联显示,如何写sql查询语句
- 如何用SQL语句查询一个数据表所有字段的类型
- 原!!mybatis如何直接 执行传入的任意sql语句 并按照顺序取出查询的结果集
- 如何用SQL语句,查询数据库(日期+时间字段)中等于某一天的记录
- MSSQL中如何用SQL语句查询字段类型?
- 在一个千万级的数据库查寻中,如何提高查询效率?分别说出在数据库设计、SQL语句、java等层面的解决方案。
- 使用SQL语句查询某表中所有的主键、唯一索引以及这些主键、索引所包含的字段(转)
- 用sql语句,将两个字段合并,并当做条件进行查询的方法
- 实际——如何给SQL查询添加合计行(sqlserver2008。但是db2的case when 语句end后不能添加其他字段)
- 如何把个表的合计字段 合并SQL查询到一个结果集中
- hibernate中的query查询原生sql语句,如何获得返回记录中的每一个字段的值
- 传值设置mybatis查询的 列名(字段名),以及如何查看mybatis中执行的SQL语句
- 如何用一条SQL语句,将多条记录(一个字段)合并为一个?
- sql查询语句_多字段分类汇总_多表合并