SQL子查询连接与求和:合并去重及汇总查询需求
合并去重与汇总后的SQL表连接方案
我来帮你梳理下这个需求的实现思路哈,核心就是先分别完成两个表的预处理(Table1去重、Table2按ID汇总消费),再把处理后的结果通过ID字段关联起来。下面给你两种常用的实现方式:
方式一:使用CTE(公共表表达式)更清晰
这种方式把两个表的预处理逻辑分开写,可读性更强:
WITH Deduplicated_Table1 AS ( -- 对Table1去重,保留唯一的ID及其他字段 SELECT DISTINCT * FROM Table1 ), Aggregated_Table2 AS ( -- 对Table2按ID分组,汇总dollarspent SELECT ID, SUM(dollarspent) AS total_dollarspent FROM Table2 GROUP BY ID ) -- 基于ID连接两个预处理后的表 SELECT dt1.*, at2.total_dollarspent FROM Deduplicated_Table1 dt1 LEFT JOIN Aggregated_Table2 at2 ON dt1.ID = at2.ID;
方式二:子查询嵌套实现
如果你的数据库版本不支持CTE,也可以用子查询直接嵌套:
SELECT dt1.*, at2.total_dollarspent FROM ( -- 子查询实现Table1去重 SELECT DISTINCT * FROM Table1 ) dt1 LEFT JOIN ( -- 子查询实现Table2按ID汇总 SELECT ID, SUM(dollarspent) AS total_dollarspent FROM Table2 GROUP BY ID ) at2 ON dt1.ID = at2.ID;
关键细节说明
- 关于连接类型:上面用的是
LEFT JOIN(左连接),会保留所有去重后的Table1行,如果Table2中没有对应ID的记录,total_dollarspent会显示为NULL。如果只需要保留两表都存在的ID,可以把LEFT JOIN改成INNER JOIN(内连接)。 - Table1去重的替代方案:如果Table1的重复行是因为ID重复(其他字段也一致),用
SELECT DISTINCT *没问题;如果ID相同但其他字段有差异,你可能需要用GROUP BY ID并配合聚合函数(比如MAX()/MIN())来选择保留哪一行数据。 - 汇总准确性:
SUM(dollarspent)会自动忽略NULL值,所以如果Table2中某些ID的dollarspent有NULL,不影响最终汇总结果。
内容的提问来源于stack exchange,提问作者ryan199004
相关产品推荐
相关产品推荐

