Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ROW_NUMBER() как выбрать из БД нужную строку  [new]
xreal
Member

Откуда:
Сообщений: 12
Здравствуйте!

Дело в том, что мне необходимо выбрать id из базы такого вида:

id | name | password
---------------------
0 Nick 123
1 Jane 321
...

Но при этом я знаю лишь номер ряда в таблице. Как я понимаю, я бы мог это сделать в MySQL при помощи Limit, но в MSSQL так не пойдёт. Пробовал вот так:

SELECT * FROM(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SrNo, id FROM МОЯ_ТАБЛИЦА) AS test WHERE SrNo=1

Но результат пустой возвращается. Подскажите, пожалуйста, как сделать правильный запрос.
21 ноя 12, 15:07    [13507969]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гость333
Member

Откуда:
Сообщений: 3683
xreal,

Что такое "номер ряда" в вашем понимании?
21 ноя 12, 15:14    [13508055]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
В таблицах нету никаких номеров строк. Без явного указания в запросе order by строки будут возвращаться в порядке, удобном серверу в данный момент.
Ну и если приведенный запрос возвратил пустой набор, значит таблица пуста.
21 ноя 12, 15:14    [13508060]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
xreal
Member

Откуда:
Сообщений: 12
Таблица не пуста. И всё, что вы пишите я понимаю. Но дело в том, что я знаю только номер строки в таблице, под этим я понимаю

id | name | password
---------------------
0 Nick 123 - НУЛЕВАЯ СТРОКА
1 Jane 321 - ПЕРВАЯ СТРОКА
0 Nick 123 - и тд
1 Jane 321
0 Nick 123


Мне нужно выбрать id именно но порядковому номеру строки в таблице. Я так понимаю можно воспользоваться ROW_NUMBER()
21 ноя 12, 16:12    [13508626]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
xreal
Таблица не пуста. И всё, что вы пишите я понимаю. Но дело в том, что я знаю только номер строки в таблице, под этим я понимаю

id | name | password
---------------------
0 Nick 123 - НУЛЕВАЯ СТРОКА
1 Jane 321 - ПЕРВАЯ СТРОКА
0 Nick 123 - и тд
1 Jane 321
0 Nick 123


Мне нужно выбрать id именно но порядковому номеру строки в таблице. Я так понимаю можно воспользоваться ROW_NUMBER()
Скажу по секрету - у строк нет номеров.
21 ноя 12, 16:14    [13508647]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Glory
Member

Откуда:
Сообщений: 104751
xreal
Мне нужно выбрать id именно но порядковому номеру строки в таблице. Я так понимаю можно воспользоваться ROW_NUMBER()

ROW_NUMBER() возвращает вовсе не порядковый номер строки в таблице.
Эта функция нумерует _результаты_ запроса.
21 ноя 12, 16:22    [13508708]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гость333
Member

Откуда:
Сообщений: 3683
xreal
id | name | password
---------------------
0 Nick 123 - НУЛЕВАЯ СТРОКА
1 Jane 321 - ПЕРВАЯ СТРОКА
0 Nick 123 - и тд
1 Jane 321
0 Nick 123

То есть строки в таблице дублируются?
Можно поинтересоваться, каким образом вы предварительно узнаёте "номер строки", по которому в дальнейшем хотите сделать выборку?
21 ноя 12, 16:24    [13508730]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
xreal
Member

Откуда:
Сообщений: 12
Сергей Алексеевич, спасибо за откровение, но я в курсе, но задача у меня именно такая...

Гость333, не обязательно дублируются, знаю из выбранного в DataGridView это C#

Glory, а вот у вам спасибо, потому что действительно очень полезное замечание, может что-нибудь и придумаю=)
21 ноя 12, 23:26    [13510650]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
xreal
Member

Откуда:
Сообщений: 12
Не знаю, что вызвало помутнение моего рассудка, когда я такую чепуху пытался сделать средствами SQL)

Осенило, что решение проще простого)) Делаю SELEST id FROM table, получаю все id таблицы, в цикле прохожу по выборке, когда достигаю нужной строки, беру id и всё=)
22 ноя 12, 00:04    [13510755]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
xreal
Осенило, что решение проще простого)) Делаю SELEST id FROM table, получаю все id таблицы, в цикле прохожу по выборке, когда достигаю нужной строки, беру id и всё=)
Да, решение подобно постановке задачи :-)

Мало того, что решение неэффективно, так ещё и постановка такая... с учётом того, что эти id могут возвращаться в произвольном порядке...
22 ноя 12, 00:12    [13510766]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
xreal
Member

Откуда:
Сообщений: 12
если есть более эффективное решение - прошу))

id возвращаются в правильном порядке уже автоматизировал проверку и всё как надо)
22 ноя 12, 00:16    [13510770]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
xreal
если есть более эффективное решение - прошу))
Вы его уже выкладывали:
xreal
SELECT * FROM(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SrNo, id FROM МОЯ_ТАБЛИЦА) AS test WHERE SrNo=1

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

Например, выполнить 2 запроса подряд:
SELECT * FROM(SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS SrNo, id FROM МОЯ_ТАБЛИЦА) AS test WHERE SrNo=1
SELECT * FROM МОЯ_ТАБЛИЦА

xreal
id возвращаются в правильном порядке уже автоматизировал проверку и всё как надо)
Вы не можете это знать, в правильном или нет, вы можете только предполагать на основании нескольких выполнений на вашем компе.

Понятно, что если вам надо показать злому боссу или преподу, и всё стереть - для этого достаточно, а для рабочей системы не прокатит. Потому что запрос SELEST id FROM table возвращает записи в произвольном порядке, что совершенно естественно, раз вы это указали серверу.
22 ноя 12, 00:34    [13510815]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
xreal
Сергей Алексеевич, спасибо за откровение, но я в курсе, но задача у меня именно такая...
Тогда поздравляю, она не решаема.
22 ноя 12, 00:46    [13510841]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
xreal
Member

Откуда:
Сообщений: 12
Гавриленко Сергей Алексеевич, спасибо, конечно, за поздравления, только я выше написал как решил, к тому же alexeyvg тоже пишет о возможном решении. А вообще в программировании нет нерешаемых проблем. Так что лучше никогда так не говорите.

alexeyvg, спасибо, разберусь с этим делом, потому что хотелось бы сделать всё максимально эффективно.
22 ноя 12, 02:20    [13510980]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
aleks2
Guest
xreal
Гавриленко Сергей Алексеевич, спасибо, конечно, за поздравления, только я выше написал как решил, к тому же alexeyvg тоже пишет о возможном решении. А вообще в программировании нет нерешаемых проблем. Так что лучше никогда так не говорите.

Не. Проблема дураков и холтурщиков в программировании - неразрешима.

Если бы строители строили дома так, как программисты пишут программы - один дятел мог бы разрушить цивилизацию. (с) не мое.

xreal
alexeyvg, спасибо, разберусь с этим делом, потому что хотелось бы сделать всё максимально эффективно.


Ну заведите, чтоле, поле, определяющее порядок строк. Identity али дату какую.
22 ноя 12, 06:25    [13511052]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
xreal
к тому же alexeyvg тоже пишет о возможном решении
Кажется, я тоже писал о неразрешимости :-)
xreal
А вообще в программировании нет нерешаемых проблем. Так что лучше никогда так не говорите.
Это не задача программирования. Ни на каком языке, никаким способом задача не решается, поскольку ошибка заключается в постановке.

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

При чём тут синтаксические конструкции и языки программирования?
22 ноя 12, 08:20    [13511188]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
xreal
Гавриленко Сергей Алексеевич, спасибо, конечно, за поздравления, только я выше написал как решил, к тому же alexeyvg тоже пишет о возможном решении. А вообще в программировании нет нерешаемых проблем. Так что лучше никогда так не говорите.
Это вам только так кажется, что вы решили.
22 ноя 12, 09:50    [13511502]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
kain111
Member

Откуда:
Сообщений: 227
в тему вопрос. подтвердить или опровергнуть знания. при запросе select без условий сортировки и фильтра строчки выдаются в постоянном порядке же ? т.е. если вставить в табличку 1,2,3,4,5. Если табличка в куче, то будет выдавать по мере поступления, если есть кластерный индекс то согласно его порядку ?
22 ноя 12, 10:48    [13511701]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
aleks2
Guest
kain111
в тему вопрос. подтвердить или опровергнуть знания. при запросе select без условий сортировки и фильтра строчки выдаются в постоянном порядке же ? т.е. если вставить в табличку 1,2,3,4,5. Если табличка в куче, то будет выдавать по мере поступления, если есть кластерный индекс то согласно его порядку ?

1. Как бе документировано: без кляузы ORDER BY порядок выборки НЕОПРЕДЕЛЕН.
2. Т.е. может так, а может сяк. А может 1000раз так, а на 1001-й раз сяк.
22 ноя 12, 10:51    [13511712]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
kain111
Если табличка в куче, то будет выдавать по мере поступления, если есть кластерный индекс то согласно его порядку ?
В том порядке, который будет выгоднее серверу в момент выполнения.
22 ноя 12, 11:12    [13511802]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kain111
подтвердить или опровергнуть знания. при запросе select без условий сортировки и фильтра строчки выдаются в постоянном порядке же ?

Опровергаю знания.
CREATE TABLE #NUMBERS (ID INT IDENTITY PRIMARY KEY CLUSTERED);
GO
-- Заполняем числами от 1 до 100
INSERT #NUMBERS DEFAULT VALUES;
GO 100
SELECT * FROM #NUMBERS; -- Вроде в порядке возрастания
GO
CREATE INDEX IX ON #NUMBERS(ID DESC);
GO
SELECT * FROM #NUMBERS; -- Упс... уже в порядке убывания
GO
DROP INDEX IX ON #NUMBERS;
GO
SELECT * FROM #NUMBERS; -- И снова в порядке возрастания
GO
DROP TABLE #NUMBERS;
22 ноя 12, 11:21    [13511847]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
kain111
Member

Откуда:
Сообщений: 227
всем спасибо.
Гость333,

ваш пример не показателен. имелось ввиду запросы конечно же без изменения структуры таблицы. понимания сортировки из за созданного индекса я описал в следующем уточняющем предожении.
22 ноя 12, 11:34    [13511926]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Glory
Member

Откуда:
Сообщений: 104751
kain111

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

Структуру можете менять в другом коннекте и другим пользователем.
22 ноя 12, 11:39    [13511971]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
kain111
всем спасибо.
Гость333,

ваш пример не показателен. имелось ввиду запросы конечно же без изменения структуры таблицы. понимания сортировки из за созданного индекса я описал в следующем уточняющем предожении.
"Неупорядоченный скан индекса? Не, не слышал."
22 ноя 12, 12:13    [13512170]     Ответить | Цитировать Сообщить модератору
 Re: ROW_NUMBER() как выбрать из БД нужную строку  [new]
Гость333
Member

Откуда:
Сообщений: 3683
kain111
Гость333,

ваш пример не показателен. имелось ввиду запросы конечно же без изменения структуры таблицы.

Пример из моей практики (скрипта для воспроизведения не будет, извините) — один и тот же запрос может возвращать данные в разном порядке, если используется параллелизм.

Как я в общих чертах понимаю этот эффект (может быть, и неправильно): пусть запрос использует два процессора. Database Engine распределяет между ними задачи: "процессор 1, обработай данные с 1 по 100000; процессор 2, обработай данные с 100001 по 200000". При первом выполнении процессор 1 раньше успел обработать и отдать свою порцию данных; при втором выполнении быстрее оказался процессор 2. В итоге один и тот же набор данных, без изменения структуры таблицы, будет выдан в разном порядке.
22 ноя 12, 12:20    [13512218]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить