You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多列去重后关联查询:无需临时表实现目标结果集

问题:合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 04:26:05