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

MySQL实现Left Join仅匹配首条数据且保留主表全部行

实现Left Join并仅保留同一id首行的关联数据

问题分析

需要保留table_1的所有行,但对同一id仅在第一条匹配行显示table_2的service_date,其余同id行的该字段设为NULL。普通Left Join会将table_2的匹配数据重复关联到table_1的同id行,无法满足需求。

解决方案

利用窗口函数ROW_NUMBER()为table_1中每个id的行分组排序,标记出每组首行,再通过条件判断仅在首行填充service_date:

SELECT 
    t1.id,
    t1.month,
    CASE WHEN rn = 1 THEN t2.service_date ELSE NULL END AS service_date
FROM (
    -- 给table_1每个id下的行按month排序并编号
    SELECT 
        id,
        month,
        ROW_NUMBER() OVER (PARTITION BY id ORDER BY month) AS rn
    FROM table_1
) t1
LEFT JOIN table_2 t2 
    ON t1.id = t2._id; -- 注意table_2的关联字段是_id

逻辑说明

  1. 子查询中,PARTITION BY id将table_1按id分组,ORDER BY month确定每组内的行顺序(保证首行符合你的预期,比如按月份先后),ROW_NUMBER()为每组内的行生成从1开始的序号。
  2. 主查询通过LEFT JOIN关联table_2,再用CASE语句判断:仅当行序号rn=1时,取table_2的service_date,否则设为NULL。
  3. 该方式既完整保留了table_1的所有行,又严格控制了service_date的显示逻辑。

内容的提问来源于stack exchange,提问作者Scott Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 13:01:15