SQL Server三表INNER JOIN查询出现重复行问题求解
重复行问题原因
- 多表关联的笛卡尔积扩张:同一个
subject_garde_id可对应tblsubcription表中多条订阅记录,也可能对应tbltopic中多条主题记录、tblsubject_grade中多条匹配记录,单条主题记录会被匹配出多行结果。 DISTINCT逻辑限制:DISTINCT会对查询返回的整行所有字段做去重判定,你当前的查询字段包含了t1.subscribe_id,同一个主题如果关联到多个不同的subscribe_id,整行数据会被判定为非重复行,所以DISTINCT不会过滤这类结果。
解决方案
可根据实际查询需求选择对应方案:
- 不需要返回订阅ID,仅查询存在对应订阅的主题信息
直接移除查询字段中的t1.subscribe_id,或改用性能更优的EXISTS子查询:
SELECT t.topic_id, t.topic_name, t.topic_cover, t.topic_viewers FROM tbltopic t WHERE EXISTS ( SELECT 1 FROM tblsubject_grade tg INNER JOIN tblsubcription t1 ON tg.subject_garde_id = t1.subject_garde_id WHERE t.subject_garde_id = tg.subject_garde_id )
- 需要保留订阅ID,且每个主题仅展示一条记录
使用分组聚合取指定订阅ID(如下示例取最大/最新的订阅ID):
SELECT t.topic_id, t.topic_name, t.topic_cover, t.topic_viewers, MAX(t1.subscribe_id) AS subscribe_id FROM tbltopic t INNER JOIN tblsubject_grade tg ON t.subject_garde_id = tg.subject_garde_id INNER JOIN tblsubcription t1 ON tg.subject_garde_id = t1.subject_garde_id GROUP BY t.topic_id, t.topic_name, t.topic_cover, t.topic_viewers
- 关联场景为查询指定用户的订阅主题
检查是否漏加用户ID的关联/过滤条件,tblsubcription表通常会有用户ID字段,补充该条件即可避免关联到全量用户的订阅记录,减少多余匹配。
内容的提问来源于stack exchange,提问作者MTB
相关产品推荐
相关产品推荐

