合并查询union

有时在实际应用中,为了合并多个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的知识点也不是不知道,只是使用的太少,所以在第一时间没能想起来,导致浪费时间和精力。有些东西还是常用才能灵活使用呀。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值