有时在实际应用中,为了合并多个select语句的结果,可以使用集合操作符号:union,union all
在最近的一个查询交易里,根据需求,需要根据不同的传参去查询不同的表数据,也有一种情况,会要求查询两个表的汇总数据,并且按照时间倒序排列。
对于这个需求,并不是多难,唯一麻烦的是查询全部时要对两个表数据进行排序。
select A.name, A.id, A.desc_str, A.age, A.push_date desc_date from test_table1 A order by A.push_date desc;
select B.name, B.id, B.desc_str, B.age, B.push_date desc_date from test_table2 B order by B.push_date desc;
开发最初时,并未想起union的功能(毕竟union对于我来说不常用),于是进行分别查询,然后根据需要排序的字段对两个结果集进行排序处理。即如下代码,不得不说,编写边吐槽难受呀。
根据两条数据的查询结果进行整理获取数据
List<Map<String, Object>> allList = new ArrayList<>();
int num = 0;循环时retList2的起始值
boolean endFlg = false;结束判断标志
将retList1和retList2的值根据desc_time的值进行排序并写入到retList里
try {
for(int i=0; i<retList1.size(); i++) {
Map<String, Object> map1 = retList1.get(i);
String desc_time1 = (String)map1.get("desc_time");
System.out.println("desc_time1===="+desc_time1);
for(int j=num; j<retList2.size(); j++) {
Map<String, Object> map2 = retList2.get(j);
String desc_time2 = (String)map2.get("desc_time");
System.out.println("desc_time2===="+desc_time2);
if(desc_time1.compareTo(desc_time2) >= 0) {两个字符串值比较结果为正整数时为
allList.add(map1);
if(i == retList1.size() - 1) {当retList1里最后一个map加载到allList里时,需要将retList2未加载到allList里的map加载进去
for(int k=j; k<retList2.size(); k++) {
allList.add(retList2.get(k));
}
break;
}else {
break;
}
}else {
allList.add(map2);
num = num + 1;
if(j == retList2.size() - 1) {当retList2里最后一个map加载到allList里时,需要将retList1未加载到allList里的map加载进去
for(int k=i; k<retList1.size(); k++) {
allList.add(retList1.get(k));
}
endFlg = true;
}
}
}
if(endFlg) {
break;
}
}
} catch (Exception e) {
logger.info("数据处理异常:{}", e);
result.put("RESPCODE","18999997");
result.put("RESPINFO","查询数据结果解析异常");
return JSONObject.toJSONString(result);
}
后来在一个问题查询时,突然想起了union,于是sql语句变成了:
select * from (select A.name, A.id, A.desc_str, A.age, A.push_date from test_table1
union all
select B.name, B.id, B.desc_str, B.age, B.push_date from test_table2 B) C
order by C.push_date desc;
一条sql语句便将上面的一串逻辑处理所代替了,既简单又方便。
补充:
union和union all的区别:
查询的全部是并集,但是union会将两个查询的重复项进行去重,而union all则是会将重复项也展示出来,对于我的这个需求,虽然几乎没有重复项,不过还是需要使用union all进行保留,以免出现问题。
小感触:union的知识点也不是不知道,只是使用的太少,所以在第一时间没能想起来,导致浪费时间和精力。有些东西还是常用才能灵活使用呀。