MySQL关联两表产生重复行,如何保留表1全量行并新增指定列
问题根因
你当前的写法有两个核心错误:
- 用了
INNER JOIN仅按ID关联,表1中每个ID的6行会和表2中同ID的所有行交叉匹配,产生笛卡尔积,自然会出现多余的行,同时还会丢失表1中没有匹配表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
相关产品推荐
相关产品推荐

