Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > Вывод номера записи через select


Автор: Delphist 6.10.2008, 14:59
Скажите, пожалуйста, как с помощью select сделать так, чтобы дополнительно выводилось поле с номером строки.
Т.е. есть у нас таблица MyTable с 3-ми полями:
ROW_ID, RAW_NAME, RAW_TYPE_ID
сделав вот такой запрос:
Код

select * from MyTable where raw_type_id=2

выполнив такой запрс, мы получим список сырья с типом=2.
Хотелось бы еще, чтобы каждая запись пронумеровалась т.е. типа вот этого
Код

select inc(k) as row_num,  * from MyTable where raw_type_id=2

Возможно ли такое с использованием Firebir 2.0
На sql.ru предложили вот такой вариант:
Код

select count(1) as rn,
t1.name,
t1.age
from t t1
join t t2 on t1.name >= t2.name
group by t1.name, t1.age

но он меня не очень устраивает, мож есть другие спообы.

Автор: Deniz 6.10.2008, 15:34
Delphist, можно посмотреть в сторону for select ...

Автор: Delphist 6.10.2008, 15:44
Цитата(Deniz @  6.10.2008,  16:34 Найти цитируемый пост)
Delphist, можно посмотреть в сторону for select ... 

Через хранимую процедуру как то не хотелось, потому как сортировкой а как следствие и нумерация строк хотелось бы управлять на клиенте

Автор: Deniz 6.10.2008, 15:59
Цитата(Delphist @  6.10.2008,  18:44 Найти цитируемый пост)
потому как сортировкой а как следствие и нумерация строк хотелось бы управлять на клиенте 
так может грид какой умеет это делать? или в CDS запихнуть?

Автор: Delphist 6.10.2008, 16:27
[quote=Deniz, 6.10.2008,  16:59, post1660238]так может грид какой умеет это делать?
Гридом я пользуюсь EhLib'овским. И мне необходимо, чтобы номера строк хранились все же в DataSet'e.
Цитата(Deniz @  6.10.2008,  16:59 Найти цитируемый пост)

или в CDS запихнуть

Что такое CDS?

Автор: Akella 6.10.2008, 17:10
Добавлено @ 17:17
http://www.sql.ru/faq/faq_topic.aspx?fid=126

вспомнил
Код

select w.rdb$db_key, w.* from water w;


DB_KEY    ID    NAME    EXP

156:1    1    +    T
156:2    2    -    T
156:3    5    хол.    T
156:4    7    хол+гор.    T
156:5    10    колодец    T
156:6    11    колонке    T
156:7    20    по улице    T
156:8    81    ?    T

результаты из IBExpert

Автор: Akella 6.10.2008, 17:28
теперь в событии столбца ongettext, помоему, парсим результат и показываем всё, что справа от двоеточия

Добавлено через 1 минуту и 14 секунд
Цитата(Deniz @  6.10.2008,  15:34 Найти цитируемый пост)
Delphist, можно посмотреть в сторону for select ...

тоже прекрасный вариант с хранимкой или execute block`ом

Автор: vladimir74 6.10.2008, 17:35
Цитата(Akella @  6.10.2008,  15:10 Найти цитируемый пост)
    
select w.rdb$db_key, w.* from water w;

ты уверен что это работает? я у себя на firebird посмотрел - w.rdb$db_key возвращает 16-чный код и не по порядку... надо в документации посмотреть что это....

Автор: vladimir74 6.10.2008, 18:00
ок.
только что честно спионерил с http://www.ibase.ru/ibfaq.htm#dbkey  smile 
Цитата

A: Это "номер записи". Для таблиц он имеет длину 8 байт (для view - 8 байт умножить на количество таблиц в запросе, если запрос содержит явный или неявный join), которые представлены в виде строки, содержащей двоичные значения. Поэтому в ряде инструментов запрос
select rdb$db_key, t.* from table t
будет возвращать "мусор" в первом столбце.

а тут правда http://entwickler-forum.de/showthread.php?t=7784  smile юнит как через TIBDataSet в TDBGrid показать то что как я понял хочет автор. Там написано, что это работает - но я не проверял а потому снимаю с себя всю ответственность. Если совсем не работает можно будет посмотреть что там накалякали...

Автор: Akella 7.10.2008, 16:28
vladimir74, никто не пионерил smile

Добавлено через 1 минуту и 19 секунд
Цитата(vladimir74 @  6.10.2008,  17:35 Найти цитируемый пост)
w.rdb$db_key возвращает 16-чный код 

кто/что возвращает? smile  ГДЕ?

Автор: vladimir74 7.10.2008, 17:08
Цитата(Akella @  7.10.2008,  14:28 Найти цитируемый пост)
vladimir74, никто не пионерил smile

неправда!! я сам и спионирил, когда ты написал!!! сам не знал про это пошел погуглям, и сам нарвался на эту статью что и дал тут ссылку!!!
Цитата(Akella @  7.10.2008,  14:28 Найти цитируемый пост)
кто/что возвращает? smile  ГДЕ? 

у меня.  Во всяком случае ничего типа я не получил.
Цитата(Akella @  6.10.2008,  15:10 Найти цитируемый пост)
156:7    20    по улице    T
156:8    81    ?    T


у меня вот такой вывод получился (кусок из моей таблицы)

Цитата

DB_KEY                         GRIDID            LEVEL    GROUPID
000000B1000884D2    40.000.570    1.082     27    
000000B1000884D8    40.000.571    24.081     27    
000000B1000C2157    40.000.263    24.067    27    

кстати заметил, что данные занесенные последовательно в одну таблицу имеют последовательный порядковый номер. Отсюда делаю вывод, что как бы небыл записан rdb$db_key там хранится не только порядковый номер записи...
Может я в чем то и не прав, не знаю....

Автор: Akella 7.10.2008, 20:31
Цитата(vladimir74 @  6.10.2008,  18:00 Найти цитируемый пост)
только что честно спионерил с ibase.ru 

я думаю и так понятно, что много информации берётся с ibase.ru и sql.ru  smile , это как бы сказать, первоисточник для русскоязычных программистов

Добавлено через 41 секунду
Цитата(vladimir74 @  7.10.2008,  17:08 Найти цитируемый пост)
Цитата(Akella @  7.10.2008,  14:28 Найти цитируемый пост)
кто/что возвращает? smile  ГДЕ? 

у меня.  

блин  smile  smile  smile , да я и так понял, что У ТЕБЯ!!!!!!1 smile

Добавлено через 2 минуты и 1 секунду
Цитата(vladimir74 @  7.10.2008,  17:08 Найти цитируемый пост)
DB_KEY                         GRIDID            LEVEL    GROUPID
000000B1000884D2    40.000.570    1.082     27    
000000B1000884D8    40.000.571    24.081     27    
000000B1000C2157    40.000.263    24.067    27  

Каким образом ты получил это???  В IBExpert`е?

Добавлено через 3 минуты и 22 секунды
Цитата(Akella @  6.10.2008,  17:10 Найти цитируемый пост)
результаты из IBExpert

+FB 2.0.4

Автор: vladimir74 8.10.2008, 09:27
Цитата(Akella @  7.10.2008,  18:31 Найти цитируемый пост)
Каким образом ты получил это???  В IBExpert`е?

ну ладно, самого IBExpert`а я не использовал, даные получаю едентичными в SQL Manager и если пользую компаненты IB-Objects, из программы на Delphi...
Не хочешь же ты сказать что IBExpert выводит данные не так как все другие?!!!
FireBird 2.0.2 (хотя может и выше, если уже Update сделали что обещали)

Добавлено через 6 минут и 42 секунды
Цитата(Akella @  7.10.2008,  18:31 Найти цитируемый пост)
я думаю и так понятно, что много информации берётся с ibase.ru и sql.ru  smile , это как бы сказать, первоисточник для русскоязычных программистов

ну все таки одно дело прочитать и запомнить, другое - услышать что то пойти найти и запостить  smile  smile . Хотя на самом деле - поэтому я и люблю форумы, сам не знаешь где и когда выципишь что то. что сам не дочитал....

Цитата(Akella @  7.10.2008,  18:31 Найти цитируемый пост)

блин  smile  smile  smile , да я и так понял, что У ТЕБЯ!!!!!!1 smile

да ладно, а вдруг я бы писал от соседки  smile или с бара какого то  smile  В жизни всякое бывает smile 
 smile  smile  smile  smile 

Автор: Akella 8.10.2008, 19:03
Цитата(vladimir74 @  8.10.2008,  09:27 Найти цитируемый пост)
FireBird 2.0.2 (хотя может и выше, если уже Update сделали что обещали)

т.е. ты не уверен?

Добавлено через 21 секунду
Цитата(vladimir74 @  8.10.2008,  09:27 Найти цитируемый пост)
Не хочешь же ты сказать что IBExpert выводит данные не так как все другие?!!!

поэтому и спросил

Автор: vladimir74 9.10.2008, 09:57
Цитата(Akella @  8.10.2008,  17:03 Найти цитируемый пост)
т.е. ты не уверен?

ну как тебе сказать... нет. У нас несколько серверов. Один наш тестовый, и три на котором сидят живые пользователи. Чаще всего если начальству взбредет в голову обновить версию, они делают это на тестовом сервере. Если пару недель все нормально, то идет обновление всех серверов. Все бы хорошо, но   вот последний раз я узнал об обновлении когда уже собирались обновлять все сервера....

Цитата(Akella @  8.10.2008,  17:03 Найти цитируемый пост)
поэтому и спросил 

ерунда какая то.... что то тяжело в это верится...

Добавлено через 4 минуты и 36 секунд
но если ты прав, то я лучше буду работать с тем, что дает мне реальные данные (как минимум совпадающими с тем что я прочитал на ibase.ru)

Автор: Akella 9.10.2008, 12:52
Так ты, если тебе это интересно, возьми и выполни код с использованием разных способов/технологий доступа: IBX, FibPlus, в разных гридах отобрази данные, используй базы с разными кодировками.

Добавлено через 4 минуты и 21 секунду
С использованием FIBPlus 6.9.5 + EhLib 4.2^
Код

select w.rdb$db_key, w.* from water w;


результат:
user posted image

Обрати внимание на последние цифры. Возможно, что IBExpert это переводит более читабельный формат

Автор: vladimir74 9.10.2008, 14:32
Цитата(Akella @  9.10.2008,  10:52 Найти цитируемый пост)
Обрати внимание на последние цифры. Возможно, что IBExpert это переводит более читабельный формат 

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

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

Ах да, как оказалось я дклал тест на версии 2.0.0 :( руководство опять начало играться... обещали на неделе привести все сервера на одну версию...

Автор: Akella 10.10.2008, 16:20
Цитата(vladimir74 @  9.10.2008,  14:32 Найти цитируемый пост)
мне пока на практике не разу небыла нужна,

и мне тоже, если нужно было вывести в отчёт, то в фастрепорте это реализовано

Автор: Regulum 14.12.2016, 19:14
Поднимем тему.
Возникла аналогичная задача в Lazarus - сильно глючило свойство TSQLQuery.RecNo в связке с TRxDBGrid.
Сервер Firebird 2.5, соответственно функции ROW_NUMBER() нет.
Покурив форумы, нашел решение через контекстную переменную. Может кому пригодится.
Для запроса топикстартера это будет выглядеть так:
Код

SELECT RDB$GET_CONTEXT('USER_TRANSACTION', 'RowNum') AS RowNumber, DummyField, t.*
FROM MyTable t
CROSS JOIN
   (SELECT RDB$SET_CONTEXT('USER_TRANSACTION', 'RowNum', 
    COALESCE(CAST(RDB$GET_CONTEXT('USER_TRANSACTION', 'RowNum') AS INTEGER), 0) + 1) AS DummyField
    FROM RDB$DATABASE)
WHERE raw_type_id=2


Есть один нюанс - перед запросом нужно обNULLять контекстную переменную 'RowNum'
Код

SELECT RDB$SET_CONTEXT('USER_TRANSACTION', 'RowNum', NULL)
FROM RDB$DATABASE

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)