IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   Нумерация результата SQL-запроса (http://www.imho.ws/showthread.php?t=84290)

Merlyel 22.04.2005 01:46

Нумерация результата SQL-запроса
 
При создании SQL-запроса необходимо, чтобы добавлялась еще один столбец, в котором все записи будут пронумерованы по порядку (ну то бишь 1.2,3 etc). При этом нумерация должна происходить после упорядочивания результата (в смысле после ASC/DESC).
ЗЫ. Вообще работаю с Access'овской базой, но хотелось бы иметь универсальное решение ;)

RaZEr 22.04.2005 01:49

А не проще делая "FetchRow" просто увеличивать счётчик (в самой программе)?

Ghost 22.04.2005 06:45

Jinx
Универсальное решение - то, которое сказал RaZEr. Каждый сервер измывается над SQL как душа ляжет. Например, в Oracle требуемую тбой операцию можно было бы сделать так:
Код:

SELECT F1, ROWNUM R FROM (SELECT FIELD1 F1 FROM TABLE1 ORDER BY 1);
Здесь ключевое слово "ROWNUM" как раз и обозначает номер записи в выборке, но такой финт ушами не проходит в mySQL (поковырявшись в мануале, не нашел даже ничего похожего). Из чего делаю вывод: стандарта (корректного для любой DBSM) SQL-запроса для выборки из DB записей и их нумерации не существуют.

Dolphin_spb 29.04.2005 10:59

create table #table ([inId] [int] IDENTITY (1, 1) NOT NULL ,
[col1] varchar(50),
... )
/* Далее в эту таблицу вставляешь результат select */
insert into #table(/* Перечисляешь все поля кроме [id])
select ...

S_Gur 29.04.2005 11:54

В принципе, выход, хотя двойная работа будет. На больших объемах данных напряг будет наблюдаться нехилый

Ghost 29.04.2005 12:02

Dolphin_spb
Или я ошибаюсь, или IDENTITY - автоинкрементируемое поле, а таким может быть только одно в таблице и оно должно быть ключом (непустым, есессно). Ключ заполняется автоматически, начиная от 1 и далее увеличиваясь на 1, при этом остается уникальным в пределах таблицы. Все это просто замечательно, но ключ не является _номером_ очередной записи в результате select-запроса. Т.е. если я вставлю в таблицу поля c, a, b (в таком порядке), то в таблице будут храниться записи: 1, c; 2, a; 3, b. И если я выполню запрос на сортированную по второму полю выборку, то получу: 2, a; 3, b; 1, c.
Или я чего-то не понимаю?...

S_Gur 29.04.2005 12:08

Все правильно. Только тебе сначала надо выполнить селект тех данных, которые надо пронумеровать, сделать инсерт в темповую таблицу, а потом сделать селект из этой таблицы на клиента. Двойная работа. В принципе, еще от клиента зависит. На Дельфях это делается элементарно calc-полем

Заполняться таблица должна в том же порядке, что и выдаваться потом. Человеку нужна нумерация строк его выборки, после всех сортировок и фильтраций

Ghost 29.04.2005 12:24

S_Gur
Спасибо. Теперь дошло: всю выборку (ту, которую нужно пронумеровать) вставляем во временную таблицу (создав ее непосредственно перед этим) с дополнительным автоинкрементируемым полем, которое и станет при полной выборке из этой tmp-таблицы (select * from tmp_table) номером очередной строки. Оригинально. Работать будет. Только, действительно, несколько громоздко и, при больших объемах данных, тормозно.

S_Gur 29.04.2005 12:33

Универсальное решение - только на уровне клиента. Например, в Дельфях в классе TDataSet есть свойство RecNo. Делаешь вычисляемое поле - и все работает. С серверами сложнее, у каждой СУБД свое решение этой проблемы

PSyton 01.05.2005 20:59

Ну вы тут и развели дебатов...
Как уже было сказано, самое лучшее - на уровне клиента. Это и бысрее и не привязано к конкретной реализации SQL. Временные таблицы это извращение. Мало того что у клиента будет тормозить, при достаточно большом объеме данных, так еще и сервер будет грузить попусту, если таких клиентов будет большое количество одновременно и + не универсально.


Часовой пояс GMT +4, время: 11:55.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.