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
相关产品推荐
相关产品推荐

