在 SQL 中,子查询返回多行通常出现在以下场景:
=、<、> 等只能接受单值的比较运算符下面按常见情况和解决方案说明。
SELECT *
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE location = 'Beijing'
);
如果 Beijing 对应 多个 department_id,子查询返回多行,就会报错:
ORA-01427: single-row subquery returns more than one row
IN(最常用)当子查询返回多行,且你想匹配其中任意一个值:
SELECT *
FROM employees
WHERE department_id IN (
SELECT department_id
FROM departments
WHERE location = 'Beijing'
);
✅ 适用于:
NOT IN排除子查询中的多行结果:
SELECT *
FROM employees
WHERE department_id NOT IN (
SELECT department_id
FROM departments
WHERE location = 'Beijing'
);
⚠️ 注意:NOT IN 中子查询 不能包含 NULL,否则结果可能为空。
EXISTS当只关心“是否存在”,不关心具体值:
SELECT *
FROM employees e
WHERE EXISTS (
SELECT 1
FROM departments d
WHERE d.department_id = e.department_id
AND d.location = 'Beijing'
);
✅ 优点:
如果你确实只需要一个值:
SELECT *
FROM employees
WHERE department_id = (
SELECT MAX(department_id)
FROM departments
WHERE location = 'Beijing'
);
常用聚合函数:
MAX()MIN()AVG()COUNT()ANY / ALL-- 等于其中任意一个
WHERE salary > ANY (
SELECT salary FROM employees WHERE department_id = 10
);
-- 大于所有
WHERE salary > ALL (
SELECT salary FROM employees WHERE department_id = 10
);
LIMIT(MySQL / PostgreSQL)如果你只想要一行:
WHERE department_id = (
SELECT department_id
FROM departments
WHERE location = 'Beijing'
LIMIT 1
);
| 场景 | 推荐方式 |
|---|---|
| 子查询返回多行,匹配任意一个 | IN |
| 子查询返回多行,排除 | NOT IN |
| 只判断是否存在 | EXISTS |
| 必须单行 | 聚合 / LIMIT |
| 比较大小 | ANY / ALL |
如果你能贴出具体的 SQL 语句和数据库类型(MySQL / Oracle / PostgreSQL),我可以直接帮你改。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。