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

不使用GROUP BY实现查询至少参与2个项目的员工

解决方案:不使用GROUP BY实现员工项目数统计

要实现原SQL(统计参与项目数>1的员工ID及对应项目数)且不使用GROUP BY,可以用以下两种方法:

方法1:关联子查询+去重过滤

SELECT DISTINCT
    rp.idEmploye,
    (SELECT COUNT(*) FROM ressourcesprojet_ WHERE idEmploye = rp.idEmploye) AS nbrProjet
FROM ressourcesprojet_ rp
WHERE (SELECT COUNT(*) FROM ressourcesprojet_ WHERE idEmploye = rp.idEmploye) > 1;
  • 用DISTINCT避免同一员工因多条项目记录重复出现
  • 子查询通过员工ID关联,统计该员工的总项目数,再通过WHERE过滤掉项目数≤1的记录

方法2:窗口函数(推荐,效率更高)

如果你的数据库支持窗口函数(如MySQL 8.0+、PostgreSQL、SQL Server等),可以用COUNT() OVER()实现分组统计,无需GROUP BY:

SELECT DISTINCT
    idEmploye,
    nbrProjet
FROM (
    SELECT
        idEmploye,
        COUNT(*) OVER(PARTITION BY idEmploye) AS nbrProjet
    FROM ressourcesprojet_
) AS temp
WHERE nbrProjet > 1;
  • 内层查询用窗口函数按idEmploye分组统计项目数,外层过滤出符合条件的记录并去重

对你尝试语句的问题分析

  1. 第一条语句完全偏离需求,关联的是EtapexProjet和Projet表,和员工项目数统计无关
  2. 第二条语句返回了所有员工(包括项目数为0或1的),只需添加WHERE nbrProjet > 1即可过滤,但会包含无项目的员工(显示nbrProjet为0),建议从ressourcesprojet_而非employe_取数避免这种情况
  3. 第三条语句的子查询条件idEmploye = idEmploye是同列自比较,相当于全表计数,导致所有员工都被选中,需要给外层表加别名,比如WHERE 1 < (SELECT COUNT(idProjet) FROM ressourcesprojet_ where idEmploye = rp.idEmploye),再配合DISTINCT去重

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:25:23