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

使用WHERE筛选的同表Inner JOIN SQL问题求助

问题分析与SQL修正

你的原SQL存在多处语法逻辑错误,且将两个独立查询需求错误合并,以下是分需求的修正方案:

原代码核心错误点

  • 语法顺序错误:WHERE子句不能放在JOIN之前,正确执行顺序为FROM → JOIN → WHERE → GROUP BY → HAVING → SELECT
  • 日期错误:6月没有31日,需修正为2022-06-30
  • 同表自连接未使用别名,导致字段引用歧义
  • 聚合函数COUNT误用在WHERE子句中,筛选聚合结果需用HAVING
  • 自连接的ON条件不完整,缺少师徒关联逻辑(假设表中有master_id字段标记徒弟的师父ID)

需求1:统计指定时段访问Tatoine的JEDI数量及等级

此需求无需自连接,直接过滤分组即可:

SELECT 
    COUNT(DISTINCT jedi_id) AS jedi_total,
    rank_id
FROM jedi
WHERE 
    date >= '2022-01-01' 
    AND date <= '2022-06-30' 
    AND planet = 'Tatoine'
GROUP BY rank_id;
  • 用COUNT(DISTINCT jedi_id)避免同一JEDI多次访问被重复统计
  • 修正了错误的日期范围

需求2:筛选Tatoine星球拥有1名以上Padawan的JEDI

通过同表自连接关联师徒关系,统计后筛选结果:

SELECT 
    m.jedi_name AS jedi_name,
    COUNT(p.jedi_id) AS padawan_count,
    m.rank_id AS rank
FROM jedi m
INNER JOIN jedi p 
    ON m.jedi_id = p.master_id  -- 关联师父ID与徒弟的master_id字段
WHERE 
    m.planet = 'Tatoine'
GROUP BY m.jedi_id, m.jedi_name, m.rank_id
HAVING COUNT(p.jedi_id) >= 2;
  • 给表设置别名m(师父)和p(徒弟),解决字段歧义
  • 用HAVING筛选聚合后的结果(Padawan数量≥2)
  • 若需限定师徒的访问时段,可在WHERE中添加日期条件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:24:19