Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Возможна ли такая выборка? / 25 сообщений из 50, страница 1 из 2
16.03.2018, 08:47
    #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
16.03.2018, 09:58
    #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
16.03.2018, 10:08
    #39615783
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
Док,
...
Рейтинг: 0 / 0
16.03.2018, 10:16
    #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
16.03.2018, 10:16
    #39615788
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
slay2012,

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


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

нет конечно. ID может быть с пропусками
...
Рейтинг: 0 / 0
16.03.2018, 10:23
    #39615793
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
ДокХотел узнать, можно ли проделать то же самое, но если сортировка будет осуществляться по любому другому полю. Это возможно принципиально ? Или есть другой путь? Был бы благодарен за любые советы и конструктивную критику.Сортировка "по любому полю" делается на клиенте, а при изменении сортировки у тебя в выборке может не оказаться тех строк по краям центральной строки, которые реально присутствуют в таблице, но которые ты не отфетчил. Вижу только один вариант - константные режимы сортировки, реализованные в хранимой процедуре выборки.
...
Рейтинг: 0 / 0
16.03.2018, 10:35
    #39615800
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
rdb_devСортировка "по любому полю" делается на клиенте
вот тоже подумалось уже после стартового поста.
...
Рейтинг: 0 / 0
16.03.2018, 11:08
    #39615830
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
Докrdb_devСортировка "по любому полю" делается на клиентевот тоже подумалось уже после стартового поста.У тебя там не так много полей и, возможно, тебе придется реализовать в одной хранимой процедуре 3 - 4 выборки по константным режимам сортировки. Иными словами, помимо ID, тебе придется передавать в ХП еще и режим сортировки, ну и в реализации этой ХП, копипастой нареализовывать код с заменой поля или списка полей в предложении ORDER BY.
...
Рейтинг: 0 / 0
16.03.2018, 11:44
    #39615857
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
rdb_devСортировка "по любому полю" делается на клиентЕсли не тянуть на клиента всю таблицу, то - нет, не делается.
Ибо нужно отсортировать и выбрать часть записей.
Что ты будешь сортировать на клиенте по name, когда выбрал записи, опираясь на ID ?
...
Рейтинг: 0 / 0
16.03.2018, 11:59
    #39615875
Шавлюк Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
У меня есть процедура str_to_id, в которую передается список id через запятую, в том же порядке и выдаеются. Left join с главной таблицей сортировка уже определена
...
Рейтинг: 0 / 0
16.03.2018, 12:51
    #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
16.03.2018, 13:03
    #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
16.03.2018, 13:24
    #39615939
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Возможна ли такая выборка?
rdb_dev,

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

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

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

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

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

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

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

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

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

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


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