如何选择前2名或类似的第二行?

时间:2012-01-06 01:47:05

标签: sql

我想执行2个单独的命令,从我的表中返回一个值。

第一个可能是前1,因为是第一行,没问题......

但我怎么能做出像前2名那样的东西,但只显示第二行呢?

有一种简单的方法吗?就像一个简单的选择?

1行:

  

从LastUpdate desc <产品订单中选择前1个代码

4 个答案:

答案 0 :(得分:10)

据我所知,这个问题没有通用的解决方案 - 不同的DBMS有不同的实现方法。

在Microsoft SQL Server中,您可以使用ROW_NUMBER子句:

SELECT code FROM 
    (SELECT TOP 2 code, Row_Number() OVER (ORDER BY lastupdate) AS rownum
     FROM Products) AS tbl
WHERE rownum = 2;

Oracle有一个类似的伪列,名为ROWNUM。但是,这里需要注意的是,在排序发挥作用之前,计算此值。因此,您必须再次使用子查询:

SELECT code FROM
    (SELECT code, ROWNUM rnum FROM
        (SELECT code FROM Products ORDER BY lastupdate) 
     WHERE ROWNUM <= 2)
WHERE rnum = 2

请注意,您无法在此处执行简单的ROWNUM = 2条件,因为它永远不会满足 - ROWNUM会考虑实际返回的行的数量,因此如果没有第一行返回行,ROWNUM永远不会达到值'2',因此永远不会满足条件。

在MySQL中,这更简单:

SELECT code FROM Products ORDER BY lastupdate LIMIT 2, 1

(我不熟悉MySQL,所以我不确定LIMIT是否会在ORDER BY子句之前或之后计算 - 如果其他人可以证实这一点会很好。)

其他DBMS以不同的方式进行。

答案 1 :(得分:3)

选择第一行:

select ... order by some_rule limit 1;

选择第二行:

select ... order by some_rule limit 1 offset 1;

答案 2 :(得分:1)

在MS-SQL中,我更容易记住:

选择top N行命令desc作为“表”,然后选择前1个订单asc

SELECT TOP 1 code FROM 
    (SELECT TOP 2 code, lastupdate  FROM Products ORDER BY lastupdate DESC) AS tblTempQuery
ORDER BY lastupdate ASC

答案 3 :(得分:-2)

SELECT A.CName FROM(来自Tname的SELECT cname ORDER BY cname desc FETCH FIRST 2 ROWS ON)作为A.cname的命令仅获取前1行;

其中CNAME =要引用的列, Tname =你要拉的表名。 在这里你可以用你想要获取的行替换2的值..