在 SQL 里,嵌套查询(子查询)返回多值是很常见的问题,关键要看子查询用在什么位置、你期望它返回什么。下面按场景给你总结一下解决办法。
WHERE 里(最常见)例如:
SELECT *
FROM A
WHERE A.id = (SELECT id FROM B);
如果 B 返回 多行,就会报错:
子查询返回多行
✅ 解决办法:
IN / NOT INSELECT *
FROM A
WHERE A.id IN (SELECT id FROM B);
EXISTS / NOT EXISTS(性能通常更好)SELECT *
FROM A
WHERE EXISTS (
SELECT 1 FROM B WHERE B.id = A.id
);
ANY / ALLSELECT *
FROM A
WHERE A.score > ANY (SELECT score FROM B);
SELECT 列表里(必须返回单行)例如:
SELECT
id,
(SELECT name FROM B WHERE B.aid = A.id) AS name
FROM A;
如果 B 对同一个 A.id 有多条记录,就会报错。
✅ 解决办法:
SELECT
id,
(SELECT MAX(name) FROM B WHERE B.aid = A.id)
FROM A;
JOINSELECT A.id, B.name
FROM A
JOIN B ON B.aid = A.id;
FROM 里(派生表)SELECT *
FROM (
SELECT id FROM B
) t;
这里返回多行是正常的,不会报错。
⚠️ 但如果外面再:
WHERE x = (子查询)
那就回到第 1 种情况了。
那说明数据本身有问题,可以用:
SELECT TOP 1 / LIMIT 1 / ROWNUM = 1
例如:
SELECT *
FROM A
WHERE A.id = (
SELECT id FROM B LIMIT 1
);
⚠️ 一般不推荐,除非你非常确定业务逻辑。
LIMIT 1如果你愿意,可以把具体 SQL + 报错信息 + 表结构贴出来,我可以直接帮你改到能跑 ✅
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。