在SQL Server中只有一个选择的第二行?

时间:2011-11-20 02:17:41

标签: sql-server select

我试图用SQL Server选择第二行。所以我写了一个这样的查询:

SELECT TOP 1 * From Cinema 
WHERE CinemaID!=(SELECT TOP 1 CinemaID 
                 FROM Cinema
                 ORDER BY CinemaID DESC)                      
ORDER BY CinemaID DESC 

它完成了我的需要。但我想只用一个选择做同样的事情。

我读到 MySql 中的 LIMIT 子句就是这样做的。但我找不到任何相同的东西 那个。所以我很欣赏有关找到有用的东西的任何帮助。

16 个答案:

答案 0 :(得分:35)

要获得一个选择中的第二行:

SELECT TOP 1 * From
(select Top 2 * from Cinema ORDER BY CinemaID DESC) x                     
ORDER BY CinemaID

实际上只有“一个”选择,因为外部选择仅超过2行。

答案 1 :(得分:12)

执行此操作(并与ANSI SQL标准兼容)的最佳方法是使用带有ROW_NUMBER函数的CTE(公用表表达式):

;WITH OrderedCinemas AS
(
   SELECT 
       CinemaID, CinemaName, 
       ROW_NUMBER() OVER(ORDER BY CinemaID DESC) AS 'RowNum'
   FROM dbo.Cinema
)
SELECT 
   CinemaID, CinemaName
FROM OrderedCinemas
WHERE RowNum = 2

通过使用这种结构,您可以非常轻松地获得第二高的值 - 或者第五高的(WHERE RowNum = 5)或前三行(WHERE RowNum <= 3)或任何您需要的值 - {{1值只是按顺序排列并按顺序编号供您使用。

答案 2 :(得分:7)

以下不起作用,解释原因: Using ranking-function derived column in where clause (SQL Server 2008)

我会在这里保持完整性:


SELECT row_number() OVER (ORDER BY col) r, *
FROM tbl
WHERE r = 2

更多信息: http://www.bidn.com/blogs/marcoadf/bidn-blog/379/ranking-functions-row_number-vs-rank-vs-dense_rank-vs-ntile


所以我认为最可读的方式是:

SELECT * FROM (SELECT row_number() OVER (ORDER BY col) r, * FROM tbl) q
WHERE r = 2

答案 3 :(得分:5)

由于此(旧)问题尚未使用特定的SQL-Server版本进行标记,并且(非常好的)答案中没有一个仅使用一个SELECT子句 - 因为旧的问题在旧版本中是不可能的verions - 这里只适用于最新的2012版本:

SELECT c.* 
FROM dbo.Cinema AS c                    
ORDER BY CinemaID DESC
OFFSET 1 ROW
FETCH FIRST 1 ROW ONLY ; 

SQLFiddle

进行测试

答案 4 :(得分:2)

SELECT TOP 1 * FROM tbl_CompanyMaster 
where Companyid >= (SELECT MAX(Companyid) - 1 FROM tbl_CompanyMaster)

答案 5 :(得分:1)

因此,本着只使用OP中所述的一个SELECT子句并彻底滥用T-SQL的精神,我提供了一些我永远不会建议在生产中使用但仍满足规定标准的东西:

update Cinema
set Cinema.SomeField = Cinema.SomeField
output inserted.*
from Cinema
inner join 
(
    select top 2 CinemaID, ROW_NUMBER() over (order by CinemaID desc) as RowNum
    from Cinema
) rsRowNum on rsRowNum.CinemaID = Cinema.CinemaID
where RowNum = 2

答案 6 :(得分:1)

此查询也适用于SQLITE

SELECT *  From
(select * from Cinema ORDER BY CinemaID  DESC LIMIT 2) AS name                    
ORDER BY CinemaID LIMIT 1

答案 7 :(得分:0)

您只使用一个SELECT语句。 SELECT语句可以包含任意(或多或少)数量的子查询 - 相关子查询,标量子查询等,每个子查询都有自己的SELECT子句。但它仍然只是一个SELECT语句。

如果你想避免使用子查询,你可以选择前2,并跳过你不想要的那个。但是,这种编程非常脆弱。你必须记住每次都要跳过的东西;迟早,你会忘记。

答案 8 :(得分:0)

两个选择但更快一点

select top 1 * from(
SELECT TOP 2 * From Cinema 
WHERE CinemaID
ORDER BY CinemaID DESC) top2
Order by CinemaID

答案 9 :(得分:0)

SELECT field_name FROM (SELECT TOP 2 field_name FROM table_name 
                        ORDER BY field_name DESC)
WHERE rownum = 2;

答案 10 :(得分:0)

select * from TABLE_NAME order by COLUMN_NAME desc limit 1,1 ;

COLUMN_NAME应该是“主键”或“唯一”

答案 11 :(得分:0)

select top 1* from(SELECT TOP 2 * From Cinema 
                   WHERE CinemaID
                   ORDER BY CinemaID DESC) XYZ
ORDER BY CinemaID

其中XYZ不是关键字。这只是一个词。而且这个词可以是任何东西。

答案 12 :(得分:0)

如果你需要这样做,但是:

  • 该列与id
  • 不同
  • 您需要按某个特定栏目订购
  • 不能在SELECT子句中使用FROM(如果您使用旧版本的Hibernate,请按照示例)。

你可以这样做:

select top 1 * from Cinema
where date < (select MAX(date) from Cinema)
order by date desc

答案 13 :(得分:0)

select * from 
(select  ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) as R, * from Cinema ) T1
where (select count(*) from Cinema ) - T1.R = 1

答案 14 :(得分:-1)

从sql表中获取倒数第二行的最简单方法是用户 ORDER BY CinemaID DESC 并设置 LIMIT 1,1

尝试这个

SELECT * from `Cinema` ORDER BY `CinemaID` DESC LIMIT 1,1

答案 15 :(得分:-1)

这是我的代码:

SELECT *  From
(select * from table name ORDER BY column name  DESC LIMIT 2) AS xyz                   
ORDER BY column name LIMIT 1;