在SQL查询中选择第N个记录

时间:2009-06-20 20:47:10

标签: sql sql-server-2005

我有一个我正在运行的SQL查询,但我只想选择一个特定的行。例如,假设我的查询是:

Select * from Comments

让我们说这会返回10行,我只想选择此查询返回的第8条记录。我知道我能做到:

Select Top 5 * from Comments

要获取该查询的前5条记录,但我只想选择某条记录,我可以在此查询中添加任何内容(类似于顶部)。

由于

插孔

12 个答案:

答案 0 :(得分:9)

这是一个经典的采访问题。

在Ms SQL 2005+中,您可以使用ROW_NUMBER()关键字并使谓词ROW_NUMBER = n

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
)  

SELECT * 
FROM OrderedOrders 
WHERE RowNumber = 5;

在SQL2000中,您可以执行类似

的操作
SELECT Top 1 *FROM
[tblApplications]
where [ApplicationID] In
(
    SELECT TOP 5 [ApplicationID]
    FROM [dbo].[tblApplications]
    order by applicationId Desc
)

答案 1 :(得分:4)

怎么样

SELECT TOP 1 * FROM 
   (SELECT TOP 8 * FROM Comments ORDER BY foo ASC)
ORDER BY foo DESC

答案 2 :(得分:2)

首先,您应该说出您正在使用的RDBMS。

其次,你应该仔细考虑你想要完成的事情。关系数据库是基于集合的。通常,集合中元素的顺序无关紧要。在这种情况下,你会想问为什么它很重要,然后看看是否有更好的方法将顺序概念嵌入查询本身。

例如,在SQL Server 2005(和其他RDBMS)中,您可以使用ROW_NUMBER函数根据指定的条件为返回的每一行分配一个序号。然后,您可以根据行号选择行。联机丛书中的示例:

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;

答案 3 :(得分:2)

SELECT * FROM comments WHERE ...conditions... LIMIT 1 OFFSET 8

OFFSET对MySQL来说是件好事

答案 4 :(得分:1)

好吧,在T-SQL(SQL Server的方言)中,您可以执行以下操作:

SELECT TOP 1 *
  FROM (SELECT TOP 8 *
          FROM Table
         ORDER
            BY SortField)
 ORDER
    BY SortField DESC

这样你就获得了第8张唱片。

答案 5 :(得分:1)

对于SQL Server 2005:

select rank() OVER (ORDER BY c.subject, c.date) as rank, c.subject, c.date
   from comments c
   where rank = 8

答案 6 :(得分:1)

我已阅读过问题&您对此的评论将需要接下来的3篇博客评论等。

你的桌子结构如何?
假设您有博客文章ID&注释ID是按每个博客帖子的升序生成的,您可以根据当前的ID进行SELECT。

e.g。如果blogpostId = 101,则按发布的ID获得前3个评论顺序。现在让我们说,你想获得接下来的3条评论 - 你可以在显示的最后一条评论ID到评论ID之间做一个SELECT WHERE commentId - 3

但所有这些都取决于你的表的定义方式。

答案 7 :(得分:1)

在没有ROW_NUMBER()函数的SQL 2000中,您可以使用这样的解决方法:

SELECT CommentsTableFieldList, IDENTITY(INT, 1,1) as seqNo 
INTO #SeqComments 
FROM Comments

SELECT * FROM #SeqComments 
WHERE seqNo = 8

答案 8 :(得分:1)

select top 1 *
from TableName
where ColumnName1 in
(
    select top nth ColumnName1
    from TableName
    order by ColumnName1 desc
)
order by ColumnName1 desc

答案 9 :(得分:0)

SELECT reference开始,使用LIMIT关键字:

SELECT * FROM tbl LIMIT 5,10;  # Retrieve rows 6-15
SELECT * FROM tbl LIMIT 5;     # Retrieve first 5 rows

注意:这是针对MySQL的,其他SQL引擎可能有不同的关键字。

答案 10 :(得分:0)

Select from tablename limit nthrow,1;

答案 11 :(得分:0)

试试这个

让我们假设,我们想要选择第5行WC_Video表 并且

Select * from (Select Row_Number() over (Order by Uploadedon) as 'rownumber',* from Wc_Video )as Temp where rownumber=5