多列去重后关联查询:无需临时表实现目标结果集
问题:合并T1去重后的ID-Y组合与T2数据
现有表结构及数据
T1表
+----+------+-----+ | ID | Y | AGE | +----+------+-----+ | 1 | 2022 | a | | 1 | 2022 | b | | 3 | 2021 | a | | 4 | 2021 | a | | 4 | 2021 | b | | 4 | 2021 | c | | 7 | 2021 | a | | 7 | 2022 | b | +----+-------+----+
T2表
+----+------+-----------+ | ID | num | something | +----+------+-----------+ | 1 | 10 | a1221 | | 3 | 30 | a4342 | | 4 | 40 | bdssd | | 7 | 70 | asdsds | +----+-----+------------+
期望结果集
+----+-------+-----+ | ID | Y | num | +----+-------+-----+ | 1 | 2022 | 10 | | 3 | 2021 | 30 | | 4 | 2021 | 40 | | 7 | 2021 | 70 | | 7 | 2022 | 70 | +----+-------+-----+
需求说明
提取T1中ID和Y的唯一组合(忽略AGE列),再与T2通过ID进行INNER JOIN。
当前可用CTE方案
通过公共表表达式先对T1的ID-Y组合去重,再关联T2:
WITH cte AS ( SELECT ID, Y FROM T1 GROUP BY ID, Y ) SELECT cte.ID, cte.Y, T2.num FROM cte INNER JOIN T2 ON cte.ID = T2.ID
问题点
直接执行以下查询会因T1的AGE列存在多条重复的ID-Y记录,导致结果出现重复数据:
SELECT T1.ID, T1.Y, T2.num FROM T1 INNER JOIN T2 ON T1.ID = T2.ID
无需临时表的替代方案
方案1:使用DISTINCT直接去重
这是最简洁的方案,直接在关联查询结果中去除重复的ID-Y-num组合:
SELECT DISTINCT T1.ID, T1.Y, T2.num FROM T1 INNER JOIN T2 ON T1.ID = T2.ID
方案2:使用窗口函数筛选唯一组合
如果需要更灵活的筛选逻辑(比如后续要针对每个ID-Y组合指定取某条记录),可以用ROW_NUMBER()窗口函数:
SELECT ID, Y, num FROM ( SELECT T1.ID, T1.Y, T2.num, ROW_NUMBER() OVER (PARTITION BY T1.ID, T1.Y ORDER BY (SELECT NULL)) AS rn FROM T1 INNER JOIN T2 ON T1.ID = T2.ID ) t WHERE rn = 1
方案对比
DISTINCT方案性能在多数场景下足够优秀,代码简洁,适合常规去重需求。- 窗口函数方案扩展性更强,可通过调整
ORDER BY子句,实现按特定规则选取每个ID-Y组合下的记录。
内容的提问来源于stack exchange,提问作者Saguro
相关产品推荐
相关产品推荐

