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

SQL查询报错#1242求助:如何查询完成少于4次tournee的员工姓名

解决SQL子查询返回多行的错误 + 正确查询写法

嘿,我帮你搞定这个问题!你遇到的#1242 - Subquery returns more than 1 row错误,根源很简单:你原来的查询里用了=来匹配子查询的结果,但子查询返回了多个员工ID,而=运算符只能处理单个值,这就冲突了。换成IN或者用其他写法就能解决,下面给你几种靠谱的方案:

方案1:用IN替换=(最直接的修改)

如果你只想改原来的WHERE子句,把=换成IN就行,这样就能匹配子查询返回的多个ID了。另外要确保子查询只返回员工ID列,并且分组统计正确:

SELECT e.nom
FROM employe e
WHERE e.id_employe IN (
    -- 子查询:找出所有完成tournee少于4次的员工ID
    SELECT t.id_employe
    FROM tournee t
    GROUP BY t.id_employe
    HAVING COUNT(*) < 4
);

⚠️ 注意:这个写法不会包含从未参与过任何tournee的员工(也就是次数为0的),如果需要包含这些员工,看下面的方案2。

方案2:用LEFT JOIN(推荐,能覆盖所有员工)

这种写法更直观,而且能自动把没有任何tournee的员工(计数为0,显然<4)也包含进来:

SELECT e.nom
FROM employe e
-- 左连接保留所有员工,即使没有对应的tournee记录
LEFT JOIN tournee t ON e.id_employe = t.id_employe
-- 按员工分组(用id_employe比nom更靠谱,避免同名员工)
GROUP BY e.id_employe, e.nom
-- 统计每个员工的tournee次数,忽略NULL(也就是没有tournee的情况)
HAVING COUNT(t.id_employe) < 4;

方案3:用EXISTS(性能友好,适合大数据量)

如果你的表数据量很大,用EXISTS通常会比IN更高效,因为它一旦找到匹配的记录就会停止查询:

SELECT e.nom
FROM employe e
-- 匹配完成少于4次tournee的员工
WHERE EXISTS (
    SELECT 1
    FROM tournee t
    WHERE t.id_employe = e.id_employe
    GROUP BY t.id_employe
    HAVING COUNT(*) < 4
)
-- 加上这个OR,把从未参与tournee的员工也包含进来
OR NOT EXISTS (
    SELECT 1
    FROM tournee t
    WHERE t.id_employe = e.id_employe
);

简单总结下:你之前的错误就是用了=来匹配多行的子查询结果,换成IN就能快速修复;如果需要覆盖所有员工(包括没做过tournee的),用LEFT JOIN的写法会更省心。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:07:43