在子查询中排序

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 :)

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

Sqlite:在子查询“消除”结果中排序

Oracle 分页查询在子查询中使用了 排序和like 会影响效率吗? 怎样优化呢

如何重新排序 Django-Graphene 子查询?

SQL Server - 在子查询中使用主查询中的列

在子查询 JOIN 中引用外部查询

SQL 子查询练习