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行.
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
值- 这些值只是按顺序排列并按顺序编号供您使用.
以下不起作用,解释原因: 在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)
由于这个(旧的)问题没有用特定的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上测试过