powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возможна ли такая выборка?
25 сообщений из 50, страница 1 из 2
Возможна ли такая выборка?
    #39615742
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почти пятничная тема. Экспериментирую. Есть табля
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE TBL_TEST (
    ID        INTEGER NOT NULL,
    STR_FLD   VARCHAR(100) CHARACTER SET UTF8,
    INT_FLD   INTEGER,
    CURR_FLD  NUMERIC(15,4),
    DATE_FLD  TIMESTAMP DEFAULT current_timestamp
);


На клиенте (дабы избежать полного фетча) мне надо получить определенное кол-во записей так, чтобы запись с определенным ID визуально отображалась в середине выборки. Примерно так (ID=40)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  FIRST :prmFirst -- 10
  SKIP :prmSkip --35
        ID,
       STR_FLD,
       INT_FLD,
       CURR_FLD,
       DATE_FLD
FROM TBL_TEST
ORDER BY 1


Данные на клиента фетчатся в n-заходов (в тесте в меморидатасет или VTV в доп.потоке), поэтому запрос может варьировать без ограничения фантазии (условно говоря, нужно получить запись по ID с 36 по 39 + 40 + с 41 по 45).

Хотел узнать, можно ли проделать то же самое, но если сортировка будет осуществляться по любому другому полю. Это возможно принципиально ? Или есть другой путь? Был бы благодарен за любые советы и конструктивную критику.

зы. тестовый скрипт приаатачил
=================
Док.

Win7 Ultim x64/Deb 9.2(GNOME, MATE; gtk2) i386:
FB 3.0.2.32703, диалект 3, SS,
Lazarus 1.9(r.57265); FPC 3.1.1 (r.38477), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615778
slay2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я вот так делал
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
with
    before_items as (
        select first 3
            t.Id
        from tbl_test t
        where
            t.Id < :num
        order by t.Id desc
    ),
    after_items as (
        select first 4
            t.Id
        from tbl_test t
        where
            t.Id >= :num
        order by t.Id
    ),
    all_items as (
        select
            *
        from before_items
        union all
        select
            *
        from after_items
        order by 1
    )
select
    i.Id,
    s.field1
from all_items i
inner join tbl_second s on s.test = i.Id
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615783
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615787
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

обычно такие вещи делаются без skip

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
        ID,
       STR_FLD,
       INT_FLD,
       CURR_FLD,
       DATE_FLD
FROM TBL_TEST
WHERE ID >= :ID_FIRST
ORDER BY ID
FETCH FIRST 10 ROWS ONLY



для того чтобы запись была посередине придётся делать примерно как показал slay2012

С сортировкой по другим полями тоже можно, но только если одновременно есть сортировка по ID, ну и запрос усложняется

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
        ID,
       STR_FLD,
       INT_FLD,
       CURR_FLD,
       DATE_FLD
FROM TBL_TEST
WHERE ID >= :ID_FIRST AND STR_FLD >= :STR_FLD
ORDER BY STR_FLD, ID
FETCH FIRST 10 ROWS ONLY
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615788
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
slay2012,

а разве это не эквивалент where
Код: sql
1.
2.
3.
...
WHERE t.Id BETWEEN (:num - 4) and (:num + 5)
... 


?
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615790
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

нет конечно. ID может быть с пропусками
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615793
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокХотел узнать, можно ли проделать то же самое, но если сортировка будет осуществляться по любому другому полю. Это возможно принципиально ? Или есть другой путь? Был бы благодарен за любые советы и конструктивную критику.Сортировка "по любому полю" делается на клиенте, а при изменении сортировки у тебя в выборке может не оказаться тех строк по краям центральной строки, которые реально присутствуют в таблице, но которые ты не отфетчил. Вижу только один вариант - константные режимы сортировки, реализованные в хранимой процедуре выборки.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615800
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devСортировка "по любому полю" делается на клиенте
вот тоже подумалось уже после стартового поста.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615830
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докrdb_devСортировка "по любому полю" делается на клиентевот тоже подумалось уже после стартового поста.У тебя там не так много полей и, возможно, тебе придется реализовать в одной хранимой процедуре 3 - 4 выборки по константным режимам сортировки. Иными словами, помимо ID, тебе придется передавать в ХП еще и режим сортировки, ну и в реализации этой ХП, копипастой нареализовывать код с заменой поля или списка полей в предложении ORDER BY.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615857
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devСортировка "по любому полю" делается на клиентЕсли не тянуть на клиента всю таблицу, то - нет, не делается.
Ибо нужно отсортировать и выбрать часть записей.
Что ты будешь сортировать на клиенте по name, когда выбрал записи, опираясь на ID ?
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615875
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня есть процедура str_to_id, в которую передается список id через запятую, в том же порядке и выдаеются. Left join с главной таблицей сортировка уже определена
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615918
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, правда, есть еще два варианта:
1. Через функцию sprintf (C/C++) формировать на клиенте EXECUTE BLOCK с запросами и требуемым порядком сортировки. Как-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
const char sql__tblTest[] = "EXECUTE BLOCK\r\n\
  (\r\n\
    ID_FIRST TYPE OF COLUMN TBL_TEST.ID = :param_Id\r\n\
  )\r\n\
  RETURNS\r\n\
  (\r\n\
    ID TYPE OF COLUMN TBL_TEST.ID,\r\n\
    STR_FLD TYPE OF COLUMN TBL_TEST.STR_FLD,\r\n\
    INT_FLD TYPE OF COLUMN TBL_TEST.INT_FLD,\r\n\
    CURR_FLD TYPE OF COLUMN TBL_TEST.CURR_FLD,\r\n\
    DATE_FLD TYPE OF COLUMN TBL_TEST.DATE_FLD\r\n\
  )\r\n\
AS\r\n\
    DECLARE VARIABLE m_ID TYPE OF COLUMN TBL_TEST.ID,\r\n\
    DECLARE VARIABLE m_STR_FLD TYPE OF COLUMN TBL_TEST.STR_FLD,\r\n\
    DECLARE VARIABLE m_INT_FLD TYPE OF COLUMN TBL_TEST.INT_FLD,\r\n\
    DECLARE VARIABLE m_CURR_FLD TYPE OF COLUMN TBL_TEST.CURR_FLD,\r\n\
    DECLARE VARIABLE m_DATE_FLD TYPE OF COLUMN TBL_TEST.DATE_FLD\r\n\
BEGIN\r\n\
  SELECT ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\
    FROM TBL_TEST\r\n\
    WHERE ID = :ID_FIRST\r\n\
    INTO: m_ID, m_STR_FLD, m_INT_FLD, m_CURR_FLD, m_DATE_FLD;\r\n\
  FOR\r\n\
      SELECT *
        FROM (
          SELECT ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\
            FROM TBL_TEST\r\n\
            WHERE %s\r\n\
            ORDER BY %s DESC\r\n\
            ROWS 5)\r\n\
        ORDER BY %s ASC
        INTO: ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\ 
    DO SUSPEND;\r\n\
  FOR\r\n\
      SELECT ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\
        FROM TBL_TEST\r\n\
        WHERE %s\r\n\
        ORDER BY %s ASC\r\n\
        ROWS 4\r\n\
        INTO: ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\ 
    DO SUSPEND;\r\n\
END";

и, наконец, sprintf. Например, для порядка сортировки по строке и дате (STR_FLD, DATE_FLD):
Код: plaintext
1.
2.
int cnt=sprintf(buffer, sql__tblTest, "STR_FLD <= :m_STR_FLD AND DATE_FLD <= :m_DATE_FLD", "STR_FLD, DATE_FLD",\
    "STR_FLD, DATE_FLD", "STR_FLD > :m_STR_FLD AND DATE_FLD > :m_DATE_FLD", "STR_FLD, DATE_FLD");



2. Либо, схожим образом использовать EXECUTE STATEMENT...INTO в хранимой процедуре - собирая запрос из кусков и распарсив строковый параметр с полями порядка сортировки.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615928
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В такой реализации, при некоторых условиях, возможен маленький косячок, поэтому, лучше так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
const char sql__tblTest[] = "EXECUTE BLOCK\r\n\
  (\r\n\
    ID_FIRST TYPE OF COLUMN TBL_TEST.ID = :param_Id\r\n\
  )\r\n\
  RETURNS\r\n\
  (\r\n\
    ID TYPE OF COLUMN TBL_TEST.ID,\r\n\
    STR_FLD TYPE OF COLUMN TBL_TEST.STR_FLD,\r\n\
    INT_FLD TYPE OF COLUMN TBL_TEST.INT_FLD,\r\n\
    CURR_FLD TYPE OF COLUMN TBL_TEST.CURR_FLD,\r\n\
    DATE_FLD TYPE OF COLUMN TBL_TEST.DATE_FLD\r\n\
  )\r\n\
AS\r\n\
    DECLARE VARIABLE m_ID TYPE OF COLUMN TBL_TEST.ID,\r\n\
    DECLARE VARIABLE m_STR_FLD TYPE OF COLUMN TBL_TEST.STR_FLD,\r\n\
    DECLARE VARIABLE m_INT_FLD TYPE OF COLUMN TBL_TEST.INT_FLD,\r\n\
    DECLARE VARIABLE m_CURR_FLD TYPE OF COLUMN TBL_TEST.CURR_FLD,\r\n\
    DECLARE VARIABLE m_DATE_FLD TYPE OF COLUMN TBL_TEST.DATE_FLD\r\n\
BEGIN\r\n\
  SELECT ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\
    FROM TBL_TEST\r\n\
    WHERE ID = :ID_FIRST\r\n\
    INTO: m_ID, m_STR_FLD, m_INT_FLD, m_CURR_FLD, m_DATE_FLD;\r\n\
  FOR\r\n\
      SELECT *
        FROM (
          SELECT ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\
            FROM TBL_TEST\r\n\
            WHERE %s\r\n\
            ORDER BY %s DESC\r\n\
            ROWS 5)\r\n\
        ORDER BY %s ASC
        INTO: ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\ 
    DO SUSPEND;\r\n\
  ID = m_ID;\r\n\
  STR_FLD = m_STR_FLD;\r\n\
  INT_FLD = m_INT_FLD;\r\n\
  CURR_FLD = m_CURR_FLD;\r\n\
  DATE_FLD = m_DATE_FLD;\r\n\
  SUSPEND;\r\n\
  FOR\r\n\
      SELECT ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\
        FROM TBL_TEST\r\n\
        WHERE %s\r\n\
        ORDER BY %s ASC\r\n\
        ROWS 4\r\n\
        INTO: ID, STR_FLD, INT_FLD, CURR_FLD, DATE_FLD\r\n\ 
    DO SUSPEND;\r\n\
END";

sprintf для порядка сортировки по строке и дате (STR_FLD, DATE_FLD):
Код: plaintext
1.
2.
int cnt=sprintf(buffer, sql__tblTest, "STR_FLD < :m_STR_FLD AND DATE_FLD < :m_DATE_FLD", "STR_FLD, DATE_FLD",\
    "STR_FLD, DATE_FLD", "STR_FLD > :m_STR_FLD AND DATE_FLD > :m_DATE_FLD", "STR_FLD, DATE_FLD");
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615939
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

аж кровь из глаз брызнула.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615943
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, от "\r\n"? Зато в трассировке и MON$SQL_TEXT будет форматированный запрос.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39615945
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док(дабы избежать полного фетча)
Чисто из любопытства: а что у вас за проблема с полным фетчем?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616082
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЧисто из любопытства: а что у вас за проблема с полным фетчем?
"мы тут посоветовались" ©
Я чисто эмпирически попытался замерить время полного фетча с сортировкой по ID этой табли с 400К записями. Получилось на клиенте что-то около 20-23 сек (в IBE около 15-16 сек). И это на локалке.

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

Пока в поисках и раздумье ...
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616090
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДокПри таком раскладе мне либо логику отображения записей в приложении менять надо (сейчас на
морде классическая таблица со списком пациентов со сортировкой по времени последнего
посещения),

Таки да, стоит эту логику немного осмыслить. Поскольку с сортировкой по времени последнего
посещения она как-то не согласуется с изначальной постановкой "чтобы запись с определенным
ID визуально отображалась в середине выборки".

И даже в начальной постановке лично я бы не считал фоновый фетч двух запросов в двух
направлениях "излишне проктостоматологическим". Может выглядеть страшно на первый взгляд,
но это забавное упражнение на программирование.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616232
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, кстати, если бы разработчики FirebirdSQL в следующей версии (или в каком-нибудь минорном релизе "четвёрки") реализовали запрос на изменение CORE-5583 , то можно было бы, ко всему прочему, реализовывать подобие постоянных (в пределах транзакции) серверных курсоров партионной выборкой клиентом.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616247
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

тикет полная лабуда. В таком виде как он описан шансы близки к нулю
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616248
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, у меня с англ. не очень...
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616276
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

почитал. замечу, что вначале надо научиться изъясняться на родном языке, а уже потом переводить это на другой язык.
Особенно показателен в этом плане Hommer - его request про регистр идентификаторов прямо-таки требовательный, что непривычно для англоязычной аудитории. Мы тут дубинками размахиваем, и выражаемся, и все такое, но ТАМ это не принято, люди просто не понимают такую интонацию (вероятно пока, через пару лет, видимо, тоже научатся, благодаря собственным дипломатам).
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616283
Фотография Старый плюшевый мишка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док Ибо есть у меня мысли еще попробовать тягать записи с удаленной базы через инет, если это возможно

Пока в поисках и раздумье ...

Настоятельно рекомендую реплицировать через некий центральный узел справочник пациентов и аккумулировать на нём же оперативные данные о посещениях. Справочник по логике вещей должен быть относительно стабилен, а оперативку опять же по логике вещей должно быть вполне допустимо фетчить в начале сеанса работы с этого центра. Миксить всё это добро в какое-нибудь in-memory-table и сортировать её на клиенте хоть по диагонали каждые полминуты. Я пользовал для этого клиентдасет, удобно. Позиционирование после сортировки - вообще не вопрос. При работе по сети всё упирается в символьные поля, данные - фигня по сравнению с ними, и их лучше реплицировать. Я начинал с целиковых запросов от сателлитов к центру, когда перешёл на эту схему, получил ускорение в 45 раз.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616291
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, на родном языке гораздо проще, так как можно позволить себе расписать на несколько страниц в подробностях, а там RFC, да еще и по аглицки. Если бы я перевёл русскую "партянку" через "гугель перекладач", было бы еще хуже.
...
Рейтинг: 0 / 0
Возможна ли такая выборка?
    #39616297
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,

я читая английский текст и так вижу что с родным как раз "не очень", а не "гораздо проще". Именно поэтому и упомянул, что "сначала лучше бы на родном". А если есть годное предложение, нет никаких проблем помочь перевести.
К слову, у буржуев не случайно принято месседжи оформлять в 10 слов, 25 слов, 50 слов и т.д.
...
Рейтинг: 0 / 0
25 сообщений из 50, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возможна ли такая выборка?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]