Как получить положение записи в таблице (SQL Server) - PullRequest
0 голосов
/ 21 мая 2011

Следующая проблема:

Мне нужно получить позицию записи в таблице.Допустим, у меня есть пять записей в таблице:

Name: john doe, ID: 1
Name: jane doe, ID: 2
Name: Frankie Boy, ID: 4
Name: Johnny, ID: 9

Теперь «Фрэнки Бой» находится на третьей позиции в таблице.Но как получить эту информацию с сервера SQL?Я мог бы посчитать идентификаторы, но они ненадежны, у Фрэнки есть идентификатор 4, но он находится на третьей позиции, потому что запись с идентификатором «3» была удалена.

Есть ли способ?Я знаю о ROW_RANK, но это будет дорого, потому что мне нужно сначала выбрать в основном весь набор, прежде чем я смогу ранжировать их row_rank.

Я использую MS SQL Server 2008 R2.

Ответы [ 4 ]

4 голосов
/ 21 мая 2011

Таблицы не имеют позиции. Строки в таблице (= set) идентифицируются по значению их первичного ключа. Только строки результата имеют «положение», которое может быть детерминированным при наличии предложения ORDER BY. Предполагая, что таблицы (= наборы) имеют позицию, приведет только к проблемам и является неправильным мышлением.

2 голосов
/ 21 мая 2011

Вы можете использовать row_number() для «маркировки» строк.Вы должны указать способ упорядочения строк:

select  row_number() over (order by id) as PositionInTable
,       *
from    YourTable

Если производительность является проблемой, вы можете сохранить позицию в новом столбце:

update  yt1
set     PositionInTable = rn
from    YourTable yt1
join    (
        select  row_number() over (order by id) as rn
        ,       id
        from    YourTable
        ) yt2
on      yt1.id = yt2.id

С индексомна PositionInTable это будет молниеносно.Но вам придется обновлять это после каждой вставки в таблицу.

1 голос
/ 21 мая 2011

Таблицы [концептуально] без заказа. Если вы не укажете ORDER BY в операторе выбора для упорядочения набора результатов, результаты могут быть возвращены в любом порядке. Повторные выполнения одного и того же SQL могут возвращать набор результатов в разных порядках для каждого выполнения.

Чтобы получить номер строки в конкретном наборе результатов, используйте функцию row_number ():

select row = row_number() over( order by id ) , *
from sysobjects

Это назначит номер строки каждой строке в sysobjects, как если бы таблица была упорядочена по id.

0 голосов
/ 20 октября 2017

Простой способ сделать это без использования ROW_NUMBER - просто посчитать, сколько строк в таблице имеют индекс, меньший или равный выбранному индексу, это даст номер строки.

SELECT COUNT(*) FROM YourTable WHERE ID <= 4 -- Frankie Boy, Result = 3

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...