2013-10-03 3 views
4

Я работаю над небольшим проектом, в котором мне нужно будет выбрать запись из временной таблицы на основе фактического номера строки записи.Как выбрать строку на основе номера строки?

Как выбрать запись на основе номера строки?

+0

Вы использовали Google для функции '' row_number() в sql? Какова версия вашего SQL-сервера? – Kaf

+0

Фактически записи в таблицах не имеют чисел. Пока вы не установите 'ORDER BY' в нумерации строк запроса, это не применимо. –

+0

Если вы используете SQL 2012, используйте команду sequence в столбце. Поверьте мне, это спасатель жизни. –

ответ

11

Несколько других ответов коснулись проблемы, но это могло бы объяснить. На самом деле не существует порядка, подразумеваемого в SQL (теория множеств). Таким образом, чтобы обратиться к «пятой строке» требует, чтобы ввести понятие

Select * 
From 
(
    Select 
     Row_Number() Over (Order By SomeField) As RowNum 
    , * 
    From TheTable 
) t2 
Where RowNum = 5 

В подзапросе, номер строки «создан», определив порядок вы ожидаете. Теперь внешний запрос способен вытащить пятый элемент из этого упорядоченного набора.

1

Что вы ищете, это функция row_number(), как указано в комментариях к Kaf.

Вот пример:

WITH MyCte AS 
(
    SELECT employee_id, 
      RowNum = row_number() OVER (order by employee_id) 
    FROM  V_EMPLOYEE 
    ORDER BY Employee_ID 
) 
SELECT employee_id 
FROM MyCte 
WHERE RowNum > 0 
4

Технически SQL Строка не имеет "RowNumbers" в своих таблицах. Некоторые реализации (я думаю, Oracle) предоставляют один из своих, но это не стандарт, а SQL Server/T-SQL этого не делает. Вы можете добавить его в таблицу (вид) с столбцом IDENTITY.

Или вы можете добавить одно (для реального) в запрос с помощью функции ROW_NUMBER(), но если вы не укажете свой собственный уникальный ORDER для строк, ROW_NUMBERS будут назначены недетерминированно.

+1

Возможно, вы ссылаетесь на Oracle ROWID, который не является номером строки, а физическим адресом строки. –

+0

@a_horse_with_no_name Правильно, вот и все. – RBarryYoung

1

При использовании SQL Server 2012 теперь вы можете использовать смещение/выборки:

declare @rowIndexToFetch int 
set @rowIndexToFetch = 0 

select 
    * 
from 
    dbo.EntityA ea 
order by 
    ea.Id 
offset @rowIndexToFetch rows 
fetch next 1 rows only 
+0

Или вы можете просто использовать команду sequence и создать столбец уникальных чисел. –

2

Есть 3 способа сделать это.

Предположим, у вас есть стол сотрудника с колонками как emp_id,, salary. Вам нужны 10 лучших сотрудников, у которых самая высокая зарплата.

  1. Использование row_number() аналитической функции

    Select * from 
    (select emp_id,emp_name,row_number() over (order by salary desc) rank 
    from employee) 
    where rank<=10 
    
  2. Использование rank() аналитической функции

    Select * from 
    (select emp_id,emp_name,rank() over (order by salary desc) rank 
    from employee) 
    where rank<=10 
    
  3. Использование rownum

    select * from 
    (select * from employee order by salary desc) 
    where rownum<=10; 
    
Смежные вопросы