8

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

Select * from Comments

假设这返回 10 行,我只想选择此查询返回的第 8 条记录。我知道我可以做到:

Select Top 5 * from Comments

要获取该查询的前 5 条记录,但我只想选择某条记录,我可以在此查询中放入什么来做到这一点(类似于顶部)。

谢谢

杰克

4

12 回答 12

10

这是一道经典的面试题。

在 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
)
于 2009-06-20T20:51:53.460 回答
4

怎么样

SELECT TOP 1 * FROM 
   (SELECT TOP 8 * FROM Comments ORDER BY foo ASC)
ORDER BY foo DESC
于 2009-06-20T20:58:09.907 回答
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;
于 2009-06-20T20:54:06.170 回答
2
SELECT * FROM comments WHERE ...conditions... LIMIT 1 OFFSET 8

OFFSET 对 MySQL 来说是件好事

于 2009-06-20T20:55:03.437 回答
1

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

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

这样你就获得了第 8 条记录。

于 2009-06-20T20:54:01.910 回答
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
于 2009-06-20T20:57:53.713 回答
1

我已经阅读了问题和您对您想要下 3 条博客评论等的评论。

你的表格是如何组织的?
假设您有博客文章 ID 和评论 ID 是按每个博客文章的升序生成的,您可以根据当前 ID 进行 SELECT。

例如,如果 blogpostId = 101,您将获得按发布 ID 排列的前 3 条评论顺序。现在让我们说,您想要获得接下来的 3 条评论 - 您可以在显示到评论 id 的最后一条评论 id 之间执行 SELECT WHERE commentId - 3

但这一切都取决于您的表是如何定义的。

于 2009-06-20T22:21:23.123 回答
1

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

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

SELECT * FROM #SeqComments 
WHERE seqNo = 8
于 2009-06-20T22:38:12.807 回答
1
select top 1 *
from TableName
where ColumnName1 in
(
    select top nth ColumnName1
    from TableName
    order by ColumnName1 desc
)
order by ColumnName1 desc
于 2012-04-02T05:31:13.980 回答
0

SELECT 参考中,使用 LIMIT 关键字:

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

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

于 2009-06-20T20:48:55.790 回答
0
Select from tablename limit nthrow,1;
于 2016-04-05T03:29:50.470 回答
0

试试这个

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

Select * from (Select Row_Number() over (Order by Uploadedon) as 'rownumber',* from Wc_Video )as Temp where rownumber=5
于 2016-11-09T06:17:14.523 回答