“嵌套查询报错”这个说法太宽泛了,我需要先说明:嵌套查询(子查询)报错的原因有很多种,取决于你用的数据库(MySQL / Oracle / SQL Server / PostgreSQL 等)和具体写法。
下面我按常见报错原因给你系统讲一下,你可以对照自己的 SQL 看是哪一种。
=SELECT *
FROM user
WHERE id = (SELECT user_id FROM order);
❌ 报错:
ORA-01427: single-row subquery returns more than one rowSubquery returns more than 1 row✅ 解决:
WHERE id IN (SELECT user_id FROM order);
=SELECT *
FROM user
WHERE id = (SELECT user_id FROM order WHERE id = 999);
✅ 解决:
INEXISTSSELECT
name,
(SELECT id, age FROM user2)
FROM user;
❌ 报错:子查询返回多列
✅ 正确:
SELECT
name,
(SELECT age FROM user2 WHERE user2.id = user.id)
FROM user;
WHERE 里不能直接用聚合函数 + 子查询混用SELECT *
FROM user
WHERE score > (SELECT AVG(score) FROM user GROUP BY class);
❌ 报错:子查询返回多行
✅ 正确:
WHERE score > (SELECT AVG(score) FROM user);
FROM 子查询里直接 LIMIT + ORDER BY(某些版本)SELECT *
FROM (SELECT * FROM user ORDER BY id LIMIT 10) t
WHERE age > 18;
✅ 有些版本需要加别名、或改为临时表。
SELECT *
FROM user u
WHERE EXISTS (
SELECT * FROM order o WHERE o.user_id = user.id
);
❌ user.id 在外层才存在
✅ 正确:
WHERE o.user_id = u.id
ORDER BY 但不在最外层SELECT *
FROM user
WHERE id IN (SELECT id FROM order ORDER BY time);
❌ 某些数据库直接报错
✅ 去掉子查询里的 ORDER BY
把你的 SQL 拆成三步:
SELECT ... FROM ...
你可以直接把:
贴出来,我可以直接告诉你哪一行、为什么、怎么改。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。