Oracle SQL 中的子查询

Posted

技术标签:

【中文标题】Oracle SQL 中的子查询【英文标题】:subqueries in Oracle SQL 【发布时间】:2012-10-14 05:57:19 【问题描述】:

我想在 Oracle Express 中使用 SQL 中的子查询来获取员工在其部门中获得的最高薪水的薪水 ID。我拥有的表格是:

 Employee
 Emp_id  Salary  Dept_id
 100     1000    a101
 200     2000    a101
 300     2500    b102

 Salary
 Grade   LowSal HiSal
 1       500    900
 2       901    2000
 3       2001   3000

首先我用这个查询提取了每个部门的最高工资:

SELECT Max(e.SALARY) 
FROM   EMPLOYEE e 
GROUP  BY e.DEPT_ID

结果是两条记录:2000 和 2500

下一步是获取这些薪水的等级,所以我使用以下内容:

SELECT GRADE 
FROM   SALARY 
WHERE  (SELECT Max(e.SALARY) 
        FROM   EMPLOYEE e 
        GROUP  BY e.DEPT_ID) BETWEEN LOWSAL AND HIGHSAL; 

我收到的错误是:ORA-01427:单行子查询返回多于一行

如何使用 SQL 中的子查询执行该 SQL 命令?

【问题讨论】:

工资表如何链接到员工表?连接在哪里? 【参考方案1】:

有多种方法可以编写此类查询。您可以将子查询添加到FROM 子句:

SELECT grade
FROM (SELECT max(salary) AS sal FROM employee GROUP BY dept_id) ms
JOIN salary ON ms.sal BETWEEN salary.lowsal AND salary.hisal;

或者您可以使用相关子查询:

SELECT (SELECT grade FROM salary WHERE max(salary) BETWEEN lowsal AND hisal)
FROM employee
GROUP BY dept_id

相关子查询通常较慢,因此首选第一种形式。

【讨论】:

@Manolo:第一个确实有效,请参见此处:sqlfiddle.com/#!4/0a1ab/1 你一定是在复制时出错了。 对不起,我在字段中犯了一个错误,解决方案效果很好,谢谢大家,也感谢最后一篇文章,网页似乎真的很方便。

以上是关于Oracle SQL 中的子查询的主要内容,如果未能解决你的问题,请参考以下文章

FROM中的子查询不在Oracle SQL中工作

FROM 中的子查询在 Oracle SQL 中不起作用

Oracle SQL,在 SELECT 标头中的子查询中返回唯一(最大)行(在 FROM、WHERE 之前)

哪些 SQL 数据库支持 CHECK 约束中的子查询?

使用 Oracle SQL 的子查询

VIEW 中的 Oracle SQL Reuse 子查询