Вывод порядковой нумерации в запросе.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Vladgul
Сообщения: 12
Зарегистрирован: 01 дек 2004, 16:07

Вывод порядковой нумерации в запросе.

Сообщение Vladgul » 21 сен 2007, 10:44

Уважаемые Гуру!

Подскажите как сделать в выборке по запросу (FireBird, FIB+, Delphi 7), чтобы показывался порядковый номер записи в выборке в виде отдельной колонки.
Т.е. если в результирующей выборке будет 10 записей, то нумерация должна быть от 1 до 10.

Спасибо.

Monk
Сообщения: 38
Зарегистрирован: 30 май 2006, 12:33

Re: Вывод порядковой нумерации в запросе.

Сообщение Monk » 21 сен 2007, 11:33

Vladgul писал(а):Уважаемые Гуру!

Т.е. если в результирующей выборке будет 10 записей, то нумерация должна быть от 1 до 10.

Спасибо.
А не проще такое на клиенте сделать, чтобы сервер меньше напрягать?

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 21 сен 2007, 13:04

А не проще такое на клиенте сделать, чтобы сервер меньше напрягать?
Сервер напрягать можно и нужно. :)
На то он и сервер. Клиент тупо выполняет запрос который ему подсунут и не обязан знать, что там внутри и как с этим быть.

Если ФБ 2.хх то можно ч-з execute block
Если нет то тогда ХП делать придется.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 сен 2007, 14:11

Ахренеть. Дайте две. Проперть RecNo чем не устроила?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 сен 2007, 14:16

Клиент тупо выполняет запрос который ему подсунут и не обязан знать, что там внутри и как с этим быть.
вот именно. поскольку серверу нумерация записей по барабану, тем более что она может меняться, обычно ЭТО выводят именно на клиенте.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 сен 2007, 15:29

mdfv писал(а):Если ФБ 2.хх то можно ч-з execute block
Ога. И не забыть про ES. Типа

Код: Выделить всё

execute block returns (seq_num int, val int)
as begin
  seq_num = 0;
  for execute statement 'select ' || :seq_num+1 || ', val from ... '
    into seq_num, val
  do suspend;
end
PS. Жаль, что так не сработает :cry:

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 21 сен 2007, 15:35

Merlin писал(а):Ахренеть. Дайте две. Проперть RecNo чем не устроила?
вот именно. поскольку серверу нумерация записей по барабану, тем более что она может меняться, обычно ЭТО выводят именно на клиенте.
Это все случаи когда можно все жестко прописать на клиенте. А когда заранее клиент не подготовлен, то проще с сервера вытянуть то что надо.

Например у меня отчеты в виде таблицы с несколькими разными данными один под другим уютно расположились и пронумеровались каждый с 1 по порядку.
Ога. И не забыть про ES. Типа
Это вы так оправдываете свое вынужденное сидение на старом добром 1.0.3. :wink:
PS. Жаль, что так не сработает
Может в далеком будущем
можно будет писать.....

Код: Выделить всё

select counter(from 1 step 10) from ... 
:)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 сен 2007, 17:33

mdfv писал(а): А когда заранее клиент не подготовлен, то проще с сервера вытянуть то что надо.
Чо? Не подготовлен - в смысле никогда не нажимал кнопочку ФЫ1 на датасете и не читал всплывающих букавак?

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 21 сен 2007, 18:22

Merlin писал(а):Чо? Не подготовлен - в смысле никогда не нажимал кнопочку ФЫ1 на датасете и не читал всплывающих букавак?
Датасет просто существует и ест то что ему дадут, а дать могут все что угодно, и для этого надо тогда заранее наворачивать датасет, облеплять его всякими угадалками. Но проще все сделать в запросе, а не придумывать все на все случаи жизни.
У меня в программе датасетов, в которых статично прописано что и как они должны делать и в каком виде, меньшинство, остальные кушают запросы динамически и не знают заранее что там внутри и что с этим делать.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 сен 2007, 18:44

Тяжелейший клинический случай.

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 21 сен 2007, 19:15

Я просто забочусь о тех, кто потом после меня будет это все делать, особенно если исходники утеряются...
А раз все вынесено за пределы клиента, то проблем таких не будет.
Вы наверное сторонник перекомпиляции программ по всяким пустякам.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 сен 2007, 19:21

mdfv писал(а):Например у меня отчеты в виде таблицы с несколькими разными данными один под другим уютно расположились и пронумеровались каждый с 1 по порядку.
Отчёты нумеруются отчётником. Даже самописные. Потому что задуманы для этого.

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 21 сен 2007, 19:41

Отчеты бывают всякие и нумерация бывает так же нестандартная.
Как я привел пример, две таблицы в одном отчете. И тут надо городить уже сложный отчетник. Но если мне это не надо. А просто нужна нумерация. То серверная нумерация это самый простой способ. У меня в отчетнике всего несколько страниц текста, написанных за несколько минут, и этого вполне хватает, все остальное формируется на сервере. И получаются произвольные отчеты на любой вкус, с нумерацией хоть с конца хоть с начала.

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 21 сен 2007, 19:53

mdfv писал(а):И получаются произвольные отчеты на любой вкус, с нумерацией хоть с конца хоть с начала.
Вот именно так и получается с отчётником (читай "с нумерацией на клиенте"). Как хочешь, так и нумеруешь.
А процедура выдаёт данные, которые ты ещё десять раз перевернёшь и сгруппируешь на клиенте. И если в твоём частном случае это не так - не значит, что по-другому не бывает.
Наверное, можно придумать ситуации, когда нумерация на сервере нужна. Я даже знаю сходу такие.
Но обсуждаемый случай под таковые не попадает.

Attid
Спец
Сообщения: 377
Зарегистрирован: 14 ноя 2006, 09:58

Сообщение Attid » 22 сен 2007, 13:07

кста тут или на sql_ru был еще вариант с RDB$SET_CONTEXT.


ЗЫ WildSery с 1000 сообщением тебя :beer:

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 22 сен 2007, 13:46

Attid писал(а):кста тут или на sql_ru был еще вариант с RDB$SET_CONTEXT.
Этот вариант зависим от порядка выполнения операторов в запросе, а потому не гарантирован в другой версии, надо будет перепроверять и возможно изменять порядок.
Attid писал(а):ЗЫ WildSery с 1000 сообщением тебя :beer:
8) Хм. Интересно, а счётчик можно сбросить без заведения нового логина? А то что-то сильно умным начинаю выглядеть.

golkanavt
Сообщения: 82
Зарегистрирован: 10 янв 2006, 13:57

Сообщение golkanavt » 29 сен 2007, 12:37

Насколько я понимаю, человеку нужно вот это:

Код: Выделить всё

/* способ №2 стандартный SQL */
select count (test_2.id_test) as rank, test_1.id_test, test_1.string
from test as test_1 inner join test as test_2 on
	test_1.id_test >= test_2.id_test
group by test_1.id_test, test_1.string
order by rank

/* способ №3 стандартный SQL */
select test_3.rank, test_3.id_test, test_3.string
from (select test_1.id_test,
		test_1.string,
		(select count(*) 
			from test as test_2
			where test_2.id_test <= test_1.id_test
		) as rank
	from test as test_1) as test_3
order by rank
взято отсюда

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 01 окт 2007, 14:24

golkanavt писал(а):Насколько я понимаю, человеку нужно вот это:
Не надо медвежьих услуг. Никто и не сомневается в том, что "чистый SQL может всё".
А человеку хороший совет нужен был, чего он и получил.

Ответить