![]() |
Нумерация результата SQL-запроса
При создании SQL-запроса необходимо, чтобы добавлялась еще один столбец, в котором все записи будут пронумерованы по порядку (ну то бишь 1.2,3 etc). При этом нумерация должна происходить после упорядочивания результата (в смысле после ASC/DESC).
ЗЫ. Вообще работаю с Access'овской базой, но хотелось бы иметь универсальное решение ;) |
А не проще делая "FetchRow" просто увеличивать счётчик (в самой программе)?
|
Jinx
Универсальное решение - то, которое сказал RaZEr. Каждый сервер измывается над SQL как душа ляжет. Например, в Oracle требуемую тбой операцию можно было бы сделать так: Код:
SELECT F1, ROWNUM R FROM (SELECT FIELD1 F1 FROM TABLE1 ORDER BY 1); |
create table #table ([inId] [int] IDENTITY (1, 1) NOT NULL ,
[col1] varchar(50), ... ) /* Далее в эту таблицу вставляешь результат select */ insert into #table(/* Перечисляешь все поля кроме [id]) select ... |
В принципе, выход, хотя двойная работа будет. На больших объемах данных напряг будет наблюдаться нехилый
|
Dolphin_spb
Или я ошибаюсь, или IDENTITY - автоинкрементируемое поле, а таким может быть только одно в таблице и оно должно быть ключом (непустым, есессно). Ключ заполняется автоматически, начиная от 1 и далее увеличиваясь на 1, при этом остается уникальным в пределах таблицы. Все это просто замечательно, но ключ не является _номером_ очередной записи в результате select-запроса. Т.е. если я вставлю в таблицу поля c, a, b (в таком порядке), то в таблице будут храниться записи: 1, c; 2, a; 3, b. И если я выполню запрос на сортированную по второму полю выборку, то получу: 2, a; 3, b; 1, c. Или я чего-то не понимаю?... |
Все правильно. Только тебе сначала надо выполнить селект тех данных, которые надо пронумеровать, сделать инсерт в темповую таблицу, а потом сделать селект из этой таблицы на клиента. Двойная работа. В принципе, еще от клиента зависит. На Дельфях это делается элементарно calc-полем
Заполняться таблица должна в том же порядке, что и выдаваться потом. Человеку нужна нумерация строк его выборки, после всех сортировок и фильтраций |
S_Gur
Спасибо. Теперь дошло: всю выборку (ту, которую нужно пронумеровать) вставляем во временную таблицу (создав ее непосредственно перед этим) с дополнительным автоинкрементируемым полем, которое и станет при полной выборке из этой tmp-таблицы (select * from tmp_table) номером очередной строки. Оригинально. Работать будет. Только, действительно, несколько громоздко и, при больших объемах данных, тормозно. |
Универсальное решение - только на уровне клиента. Например, в Дельфях в классе TDataSet есть свойство RecNo. Делаешь вычисляемое поле - и все работает. С серверами сложнее, у каждой СУБД свое решение этой проблемы
|
Ну вы тут и развели дебатов...
Как уже было сказано, самое лучшее - на уровне клиента. Это и бысрее и не привязано к конкретной реализации SQL. Временные таблицы это извращение. Мало того что у клиента будет тормозить, при достаточно большом объеме данных, так еще и сервер будет грузить попусту, если таких клиентов будет большое количество одновременно и + не универсально. |
Часовой пояс GMT +4, время: 11:55. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.