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

3ya*_*bos 25 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 
Run Code Online (Sandbox Code Playgroud)

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

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

Boh*_*ian 37

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

SELECT TOP 1 * From
(select Top 2 * from Cinema ORDER BY CinemaID DESC) x                     
ORDER BY CinemaID
Run Code Online (Sandbox Code Playgroud)

它实际上只是"一个"选择,因为外部选择仅超过2行.

  • 如果表只有一行,则可能返回不正确的结果. (12认同)

mar*_*c_s 12

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

;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
Run Code Online (Sandbox Code Playgroud)

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


MK.*_*MK. 7

以下不起作用,解释原因: 在where子句中使用ranking-function derived列(SQL Server 2008)

为了完整起见,我会保留在这里:


SELECT row_number() OVER (ORDER BY col) r, *
FROM tbl
WHERE r = 2
Run Code Online (Sandbox Code Playgroud)

更多信息: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
Run Code Online (Sandbox Code Playgroud)


ype*_*eᵀᴹ 5

由于这个(旧的)问题没有用特定的SQL-Server版本标记,并且(非常好的)答案都没有使用只有一个SELECT子句 - 因为旧的版本中不可能 - 这里只有一个在最近的2012+版本中:

SELECT c.* 
FROM dbo.Cinema AS c                    
ORDER BY CinemaID DESC
OFFSET 1 ROW
FETCH FIRST 1 ROW ONLY ; 
Run Code Online (Sandbox Code Playgroud)

SQLFiddle上测试