“Subquery 子查询报错”是一个比较宽泛的问题,因为不同数据库(MySQL / PostgreSQL / Oracle / SQL Server)报错信息差异很大。下面我按常见报错类型 → 排查思路 → 示例来帮你系统排查。
请先看报错原文,常见关键字:
subquery returns more than one rowoperand should contain 1 columninvalid use of group functionunknown column in subquerycannot use subquery here不同关键字,原因完全不同。
报错示例
ERROR 1242 (21000): Subquery returns more than one row
场景
SELECT *
FROM orders
WHERE user_id = (SELECT user_id FROM users WHERE age > 20);
原因
= 只能接“单行单列”子查询
解决办法
INWHERE user_id IN (SELECT user_id FROM users WHERE age > 20)
LIMIT 1WHERE user_id = (SELECT MAX(user_id) FROM users)
报错示例
Operand should contain 1 column(s)
错误写法
SELECT *
FROM orders
WHERE (user_id, amount) = (
SELECT user_id, amount FROM orders LIMIT 1
);
解决
IN错误示例
SELECT
id,
(SELECT name FROM users)
FROM orders;
解决
JOIN报错示例
Unknown column 'o.user_id' in 'where clause'
错误示例
SELECT *
FROM orders o
WHERE o.amount > (
SELECT AVG(amount)
FROM users
WHERE users.id = o.user_id
);
排查
报错示例
Invalid use of group function
错误示例
SELECT user_id
FROM orders
WHERE amount > (SELECT MAX(amount) FROM orders)
GROUP BY user_id
HAVING COUNT(*) > 0;
解决
WHEREHAVINGMySQL 常见限制
UPDATE orders
SET status = 1
WHERE user_id IN (SELECT user_id FROM orders WHERE amount > 100);
可能报错
解决
UPDATE orders o
JOIN (SELECT user_id FROM orders WHERE amount > 100) t
ON o.user_id = t.user_id
SET o.status = 1;
SELECT * FROM (子查询) t;
= → 单行单列IN → 多行单列你可以把:
贴出来,我可以直接指出哪一行有问题,并给出正确写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。