在子查询中排序
Posted
技术标签:
【中文标题】在子查询中排序【英文标题】:Order by in Sub-query 【发布时间】:2015-10-02 08:16:45 【问题描述】:我想在不使用 min() 函数的情况下从雇员表中查看具有最低工资的雇员的详细信息。为此我编写了如下代码
SELECT *
FROM Employees
WHERE SALARY IN (SELECT SALARY
FROM Employees
order by salary)
AND ROWNUM=1
这里显示错误
ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号” *原因: *操作:行错误:5 列:18
所以那里的错误是什么......????
我正在阅读这个网站
http://www.w3schools.com/sql/sql_top.asp查看oracle的语法
【问题讨论】:
【参考方案1】:您可以从已经排序的选择中选择并取第一行。
select * from
( SELECT *
FROM Employees
order by salary ) A
where rownum = 1
您无法仅在一次选择中执行此操作,因为 rownum 将在 order by 之前执行。这就是为什么我们需要将它包装在额外的 SELECT 中。
【讨论】:
【参考方案2】:IN CLAUSE 不支持 ORDER BY,因为它没有任何意义。您从一组中过滤行,过滤它们的顺序无关紧要。您应该对结果行进行排序,然后选择第一行 (ROWNUM = 1)
【讨论】:
【参考方案3】:您也可以使用 LIMIT 运算符。
SELECT *
FROM Employee
WHERE salary IN (SELECT salary
FROM Employee
order by salary)
LIMIT 1
我已经使用http://sqlfiddle.com/ 来验证这一点。你可以在这里验证:http://sqlfiddle.com/#!9/d73aa3/3/0
这里是表创建和引导语句。
CREATE TABLE Employee
(
name varchar(50),
salary double
);
insert into Employee values('bob', 80000.00);
insert into Employee values('john', 100000.00);
【讨论】:
Oracle 没有限制。它不起作用。只是随机选择薪水。 由于没有提到太多关于平台的信息,我假设它是 mysql。是的,查看错误代码有助于弄清楚这一点:) @deepakmarathe,错误代码“ORA-00907:缺少右括号”应该是一个很大的线索,它不是 mysql :)以上是关于在子查询中排序的主要内容,如果未能解决你的问题,请参考以下文章