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

SQL Server三表INNER JOIN查询出现重复行问题求解

重复行问题原因
  • 多表关联的笛卡尔积扩张:同一个subject_garde_id可对应tblsubcription表中多条订阅记录,也可能对应tbltopic中多条主题记录、tblsubject_grade中多条匹配记录,单条主题记录会被匹配出多行结果。
  • DISTINCT逻辑限制:DISTINCT会对查询返回的整行所有字段做去重判定,你当前的查询字段包含了t1.subscribe_id,同一个主题如果关联到多个不同的subscribe_id,整行数据会被判定为非重复行,所以DISTINCT不会过滤这类结果。
解决方案

可根据实际查询需求选择对应方案:

  1. 不需要返回订阅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
)
  1. 需要保留订阅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
  1. 关联场景为查询指定用户的订阅主题
    检查是否漏加用户ID的关联/过滤条件,tblsubcription表通常会有用户ID字段,补充该条件即可避免关联到全量用户的订阅记录,减少多余匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:09:03