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

MySQL关联两表产生重复行,如何保留表1全量行并新增指定列

问题根因

你当前的写法有两个核心错误:

  1. 用了INNER JOIN仅按ID关联,表1中每个ID的6行会和表2中同ID的所有行交叉匹配,产生笛卡尔积,自然会出现多余的行,同时还会丢失表1中没有匹配表2的行
  2. 没有在关联条件中增加月份匹配逻辑,导致不同月份的记录也被关联到一起

解决方案

改用LEFT JOIN保留表1的全部行,关联条件同时加上ID、月份匹配、预约状态过滤即可,不需要额外写EXISTS子查询,直接通过匹配结果判断预约标志即可:

SELECT 
    t1.ID,
    t1.DateYM,
    t1.Status,
    CASE WHEN t2.ID IS NOT NULL THEN 'Yes' ELSE 'No' END AS Appointment,
    t2.State
FROM t1
LEFT JOIN t2 
    ON t1.ID = t2.ID 
    AND DATE_FORMAT(t1.DateYM, "%Y-%m") = DATE_FORMAT(t2.Appt_date, "%Y-%m")
    AND t2.Appointment = 'Registered'

说明

  • 该语句会完整保留表1的18行数据,仅当表2中存在同ID、同月份、状态为Registered的记录时,才会填充对应的State和Appointment为Yes,否则State为null、Appointment为No,完全符合你的预期结果
  • 如果实际业务中存在同ID同月份有多条表2记录的情况,可以在查询末尾增加GROUP BY t1.ID, t1.DateYM,配合MAX(t2.State)等聚合函数避免出现多余行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:24:02