PostSQL去除连表查询中重复的列

小感触 2020年02月25日 211次浏览

今天在实现需求的时候,遇到了这样的一个要求:

aaaa0200225154235.png

以表fp_order_original_amazon为主,组合查询出一些记录。另外就是需要根据fp_original_amazon中的shop_id去fp_order_amazon中查询出对应的商店名称,于是第一次想要实现的版本的是这样的:

BBB.png

右下角的查询时间分外扎眼,毋庸置疑这种方式肯定是不可接受的。因为在这个需求里,我们是需要order_id为主作为记录返回的。没必要因为一个商店的名称而产生两条记录。造成这样的原因是因为,我们所查询的商店对应关系的fp_order_amazon表里面,shop_name以及shop_id都是重复的:

CCCC.png

条件是这样无法改变,后来就想到将查询的记录按照shop_name按照GROUP BY 关键字进行分组,但是在PostSQL里面,不像MySQL一样可以直接进行分组。

后来就像能不能让fp_order_amazon中的商店id-名称这些记录先提取出来,转换为不重复的试一下。然后将这个结果再加入到SQL语句进行匹配,相当于是弄了一个子查询单独去收集shop_id与shop_name的对应关系。试了下,是可以的:

SELECT 
	fp_order_original_amazon.id,
	fp_order_original_amazon.order_id,
	fp_order_original_amazon.create_time,
	fp_order_original_amazon.order_status,
	fp_order_original_data_amazon.resp_data,
	s.shop_name
FROM 
	fp_order_original_amazon,
	(SELECT DISTINCT shop_id, shop_name FROM "fp_order_amazon") AS s,
	fp_order_original_data_amazon
WHERE
	status = -1
AND
	s.shop_id = fp_order_original_amazon.shop_id
AND
	fp_order_original_data_amazon.order_original_id = fp_order_original_amazon.id

结果显示是以order_id为主要的依据的,虽然图中还是有重复的商店名称,但是观察create_time发现这是来自于不同的记录的,只是商店名称是一样的而已:

DDD.png