Russian Qt Forum

Qt => Базы данных => Тема начата: -QT- от Май 19, 2009, 15:20



Название: SQLite3 какой SELECT нужен ?
Отправлено: -QT- от Май 19, 2009, 15:20
Всем привет !

В SQLite3 нужно получить пронумерованную выборку.

Используя VFP это производиться
Код:
SELECT RECNO() AS npp FROM tablename WHERE id > 25
Например, так (если SQL 2005+):
Код:
SELECT ROW_NUMBER() OVER (ORDER BY name) AS number, name  FROM sysobjects
Перерыл всю документацию по SQLite3 ничего подобного не нашел.
Помогите решить задачу.


Название: Re: SQLite3 какой SELECT нужен ?
Отправлено: kirill от Май 19, 2009, 15:57
Интересный ответ из инета

Код:
select (select COUNT(0) 
                from tablename t1
                where t1.field <= t2.field
                ) as 'Row Number', field from tablename t2 ORDER BY field;

http://www.mail-archive.com/sqlite-users@sqlite.org/msg41515.html (http://www.mail-archive.com/sqlite-users@sqlite.org/msg41515.html)


Название: Re: SQLite3 какой SELECT нужен ?
Отправлено: -QT- от Май 19, 2009, 16:30
Спасибо но это не помогло:
Код:
select (select COUNT(0) from goods t1 where t1.id <= t2.id) as 'npp', name from goods t2 where razmer = 40
Выдает номер кортежа в таблице:

17 Труба Ст3. 2"
29 Труба Ст3. 1/2"
30 Профиль 10х15 Ст3.

а нужно выдать:

1 Труба Ст3. 2"
2 Труба Ст3. 1/2"
3 Профиль 10х15 Ст3.

Или я не правильно интерпретировал пример


Название: Re: SQLite3 какой SELECT нужен ?
Отправлено: White Owl от Май 19, 2009, 22:04
Код:
select (select COUNT(0) from goods t1 where t1.name <= t2.name and razmer = 40) as 'npp', name
 from goods t2 where razmer = 40
 order by name
Чтобы это работало надо:
а) Внутренний селект должен повторять внешний по всем условиям выборки.
б) Внешний селект должен быть отсортирован по уникальному полю
в) Внутренний должен иметь < или <= связь с внешним по тому же полю по которому делается сортировка внешнего


Название: Re: SQLite3 какой SELECT нужен ?
Отправлено: break от Май 20, 2009, 02:39
там есть псевдополе ROWID - но это наверное не подойдет если вам нужен именно порядковый номер (хотя какое БД имеет понятие о порядковом номере - записи в большинстве таблиц не имеется определенного порядка - даже последующийй селект может вернуть записи в другом порядке)

если бы поддерживал Хранимые процедуры - можно было бы написать такую для выборки записей из вашей таблицы + псевдостолбец с инкрементирующимся int - а так даже если заставите работать предыдущий запрос - на больших объемах данных помрет скореев всего....

Может отселектите query - а потом все данные загоните в другой контейнер и уже там проставите номер записи? То есть все произойдет на клиенте?


Название: Re: SQLite3 какой SELECT нужен ? (Решено)
Отправлено: -QT- от Май 20, 2009, 08:07
Код:
select (select COUNT(0) from goods t1 where t1.name <= t2.name and razmer = 40) as 'npp', name
 from goods t2 where razmer = 40
 order by name
Чтобы это работало надо:
а) Внутренний селект должен повторять внешний по всем условиям выборки.
б) Внешний селект должен быть отсортирован по уникальному полю
в) Внутренний должен иметь < или <= связь с внешним по тому же полю по которому делается сортировка внешнего

Вау!!! Больше спасибо все работает как нужно.