我有一个正在运行的 SQL 查询,但我只想选择一个特定的行。例如,假设我的查询是:
Select * from Comments
假设这返回 10 行,我只想选择此查询返回的第 8 条记录。我知道我可以做到:
Select Top 5 * from Comments
要获取该查询的前 5 条记录,但我只想选择某条记录,我可以在此查询中放入什么来做到这一点(类似于顶部)。
谢谢
杰克
我有一个正在运行的 SQL 查询,但我只想选择一个特定的行。例如,假设我的查询是:
Select * from Comments
假设这返回 10 行,我只想选择此查询返回的第 8 条记录。我知道我可以做到:
Select Top 5 * from Comments
要获取该查询的前 5 条记录,但我只想选择某条记录,我可以在此查询中放入什么来做到这一点(类似于顶部)。
谢谢
杰克
这是一道经典的面试题。
在 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
)
怎么样
SELECT TOP 1 * FROM
(SELECT TOP 8 * FROM Comments ORDER BY foo ASC)
ORDER BY foo DESC
首先,您应该说明您正在使用哪个 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;
SELECT * FROM comments WHERE ...conditions... LIMIT 1 OFFSET 8
OFFSET 对 MySQL 来说是件好事
那么,在 T-SQL(SQL Server 的方言)中,您可以执行以下操作:
SELECT TOP 1 *
FROM (SELECT TOP 8 *
FROM Table
ORDER
BY SortField)
ORDER
BY SortField DESC
这样你就获得了第 8 条记录。
对于 SQL Server 2005:
select rank() OVER (ORDER BY c.subject, c.date) as rank, c.subject, c.date
from comments c
where rank = 8
我已经阅读了问题和您对您想要下 3 条博客评论等的评论。
你的表格是如何组织的?
假设您有博客文章 ID 和评论 ID 是按每个博客文章的升序生成的,您可以根据当前 ID 进行 SELECT。
例如,如果 blogpostId = 101,您将获得按发布 ID 排列的前 3 条评论顺序。现在让我们说,您想要获得接下来的 3 条评论 - 您可以在显示到评论 id 的最后一条评论 id 之间执行 SELECT WHERE commentId - 3
但这一切都取决于您的表是如何定义的。
在没有 ROW_NUMBER() 函数的 SQL 2000 中,您可以使用如下解决方法:
SELECT CommentsTableFieldList, IDENTITY(INT, 1,1) as seqNo
INTO #SeqComments
FROM Comments
SELECT * FROM #SeqComments
WHERE seqNo = 8
select top 1 *
from TableName
where ColumnName1 in
(
select top nth ColumnName1
from TableName
order by ColumnName1 desc
)
order by ColumnName1 desc
在SELECT 参考中,使用 LIMIT 关键字:
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
注意:这是针对 MySQL 的,其他 SQL 引擎可能有不同的关键字。
Select from tablename limit nthrow,1;
试试这个
让我们假设,我们要选择 WC_Video 表的第 5 行并且
Select * from (Select Row_Number() over (Order by Uploadedon) as 'rownumber',* from Wc_Video )as Temp where rownumber=5