Выбор N-й записи в запросе SQL - PullRequest
7 голосов
/ 21 июня 2009

У меня есть SQL-запрос, который я выполняю, но я хочу выбрать только конкретную строку. Например, допустим, мой запрос был:

Select * from Comments

Допустим, это возвращает 10 строк, я только хочу выбрать восьмую запись, возвращаемую этим запросом. Я знаю, что могу сделать:

Select Top 5 * from Comments

Чтобы получить первые 5 записей этого запроса, но я хочу только выбрать определенную запись, есть ли что-нибудь, что я могу вставить в этот запрос для этого (аналогично top).

Спасибо

домкрат

Ответы [ 12 ]

9 голосов
/ 21 июня 2009

Это классический вопрос для интервью.

В 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
)
4 голосов
/ 21 июня 2009

Как насчет

SELECT TOP 1 * FROM 
   (SELECT TOP 8 * FROM Comments ORDER BY foo ASC)
ORDER BY foo DESC
2 голосов
/ 21 июня 2009
SELECT * FROM comments WHERE ...conditions... LIMIT 1 OFFSET 8

OFFSET - хорошая вещь для MySQL

2 голосов
/ 21 июня 2009

Сначала вы должны сказать, какую СУБД вы используете.

Во-вторых, вы должны тщательно продумать, чего вы пытаетесь достичь. Реляционные базы данных основаны на множестве. В общем, порядок элементов в наборе не имеет значения. Вы захотите спросить, почему это важно в этом случае, а затем посмотрите, есть ли лучший способ встроить концепцию порядка в сам запрос.

Например, в SQL Server 2005 (и других СУБД) вы можете использовать функцию 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;
1 голос
/ 02 апреля 2012
select top 1 *
from TableName
where ColumnName1 in
(
    select top nth ColumnName1
    from TableName
    order by ColumnName1 desc
)
order by ColumnName1 desc
1 голос
/ 21 июня 2009

В SQL 2000, где у вас нет функции ROW_NUMBER (), вы можете использовать обходной путь, подобный этому:

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

SELECT * FROM #SeqComments 
WHERE seqNo = 8
1 голос
/ 21 июня 2009

Я прочитал вопрос, и ваши комментарии по поводу вас будут требовать следующих 3 комментариев в блоге и т. Д.

Как структурированы ваши столы?
Предположим, что у вас есть идентификатор записи в блоге и идентификатор комментария генерируется в порядке возрастания для каждого сообщения в блоге, вы можете выполнить SELECT на основе текущего идентификатора.

например. если blogpostId = 101, вы получаете 3 верхних порядка комментариев по опубликованному идентификатору. Допустим, вы хотите получить следующие 3 комментария - вы можете выбрать SELECT WHERE commentId между последним отображаемым идентификатором комментария и идентификатором комментария - 3

Но все это зависит от того, как определены ваши таблицы.

1 голос
/ 21 июня 2009

Для SQL Server 2005:

select rank() OVER (ORDER BY c.subject, c.date) as rank, c.subject, c.date
   from comments c
   where rank = 8
1 голос
/ 21 июня 2009

Ну, в T-SQL (диалект для SQL Server) вы можете сделать следующее:

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

Таким образом, вы получите восьмую запись.

0 голосов
/ 09 ноября 2016

попробуйте

Предположим, мы хотим выбрать 5-ю строку таблицы WC_Video И

Select * from (Select Row_Number() over (Order by Uploadedon) as 'rownumber',* from Wc_Video )as Temp where rownumber=5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...