在子查询中排序

时间:2015-10-02 08:16:46

标签: oracle

我希望在不使用min()函数的情况下查看Employees表中具有最低工资的员工的详细信息。为此,我编写了如下代码

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的语法

3 个答案:

答案 0 :(得分:1)

IN CLAUSE不支持ORDER BY,因为它没有任何意义。您可以过滤集合中的行,但过滤它们的顺序并不重要。您应该对结果行进行排序,然后选择第一行(ROWNUM = 1)

答案 1 :(得分:1)

您可以从已经排序的选择中选择并选择第一行。

$(document).ready(function() {
  d3.json(
    "https://raw.githubusercontent.com/datasets/geo-boundaries-world-110m/master/countries.geojson",
    function(error, data) {
      var myGeoJSON = data.features;

      for (i = 0; i < myGeoJSON.length; i++) {
        var path = d3.geo.path();
        var width = 960;
        var height = 600;
        var svg = d3.select("body").append("svg")
          .attr("width", width)
          .attr("height", height);

        svg.selectAll("path")
          .data(data.features)
          .enter().append("path")
          .attr("d",path)
          .attr("fill","#3e429a");
      }
    }
  );
});

您无法在一个选项中执行此操作,因为rownum将在order by之前执行。这就是为什么我们需要在另外的SELECT中包装它。

答案 2 :(得分:0)

您也可以使用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);