首先我们先看一个需求
你有一个表用户表A 和一个用户详情表B 和一个销售单表C
A---->B 一对多关系 A---->C一对多关系
如果你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条记录结果集
这个时候 如果select语句中有聚合函数(sum count )很可能导致查询的结果不符合需求的要求。
解决办法
1. 用两条sql查询 然后通过java对结果集进行合并(操作两条记录查询出来的两个List)。
缺点:如果需求含有分页和搜索。。。用java做不了
2. 用两条sql查询 然后就是用sql的垂直合并了
select * from (sql1) 别名1 join (sql2)别名2 on(你需求需要的条件) 就是把两条sql当成两个子查询
优点:解决了用java操作List进行合并,做不了分页搜索的问题。
工作中做某张报表的时候发现的。sql语句含有多个一对多关系的时候 注意影响聚合函数的结果。所以采用了先拆分sql,然后根据需求垂直合并。