powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Можно ли выполнить одним запросом?
23 сообщений из 23, страница 1 из 1
Можно ли выполнить одним запросом?
    #38938976
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Есть две таблицы: основная и детэйл где собираются некие показатели для мастера во времени (STAMP)
Код: plaintext
1.
2.
MASTER (ID, SLICE_ID, NAME)
DETAIL (ID, MASTER_ID, STAMP, DATA1, DATA2)

Так вот, нужно получить для мастеров одного слайса показатели для каждого в какой-то момент времени.
Тоесть для одного мастера будет:
Код: plsql
1.
2.
3.
4.
select first 1 D.DATA1, D.DATA2
from DETAIL D
where D.MASTER_ID = :MID and D.STAMP <= :DST
order by D.STAMP desc


Но как выбрать для всех сразу?, тоесть
Код: plaintext
select M.[], D.[] from MASTER M where M.SLICE_ID = 3
Пробовал с CTE, derived tables, красиво/оптимизированно не получается :(
Помогите плиз!
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939061
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin MarcociПробовал с CTE, derived tables
Ничё себе. Начни с малого: описание оператора SELECT. Пойми, как с помощью него можно выбрать данные из нескольких таблиц. JOIN и прочее.
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939091
Dorin Marcoci,

Тынц . Способы 1,2,3,4,5 должны работать и в твоей версии СУБД
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939119
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

ну вот тебе через CTE. Дальше медитируй с планами

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
WITH T
AS (SELECT
        M.ID AS ID,
        M.NAM AS NAM,
        (SELECT
             ID
         FROM
             DETAIL D
         WHERE D.MASTER_ID = M.ID
           AND D.STAMP <= :DST
         ORDER BY D.STAMP DESC
         ROWS 1) AS D_ID
    FROM
        MASTER M
    WHERE M.SLICE_ID = 3)
SELECT
    T.ID,
    T.NAM,
    D.DATA1,
    D.DATA2
FROM
    T
    JOIN DETAIL D ON D.ID = T.D_ID  
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939137
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - Эх, спасибо!

1. смотрю не годится, так как в Вашем примере partitition over будет только в 3.0

2,3 наверное будут ресурсоемкие, так как в 2-ом две джоины с той же таблицы, 3 сначала находит макс запись а потом другой запрос выбирает остальные поля

Похоже для файра самый оптимальный left join с SP где там тупо запрос для мастера.
Было бы лучше если позволяло несколько плолей в подзапросе, типа:

Код: plsql
1.
2.
3.
4.
5.
select
  M.ID,
  (select first 1 D.DATA1, D.DATA2 from DETAIL D where D.MASTER_ID = M.ID and D.STAMP <= :DST order by D.STAMP desc)
 from MASTER M
where M.SLICE_ID = :SLC
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939154
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

Пробовал, работает, спасибо!
Наверное так, запросом самое оптимальное, невзирая на повторное обращения к DETAIL-u (второй идет через ID так что должно быть быстро).

Сделаю тесты с SP vs CTE и отпишусь.

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

такого не будет никогда ибо противоречит логике и стандарту. А вот это есть в стандарте

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
  M.ID,
  T.DATA1,
  T.DATA2
FROM MASTER M
        LEFT JOIN LATERAL (select D.DATA1, D.DATA2 
                           from DETAIL D 
                           where D.MASTER_ID = M.ID and D.STAMP <= :DST 
                           order by D.STAMP desc ROWS 1) T ON 1=1
WHERE M.SLICE_ID = :SLC



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

это я про

Код: sql
1.
2.
3.
4.
5.
select
  M.ID,
  (select first 1 D.DATA1, D.DATA2 from DETAIL D where D.MASTER_ID = M.ID and D.STAMP <= :DST order by D.STAMP desc)
 from MASTER M
where M.SLICE_ID = :SLC
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939185
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Дениспод него даже тикет сделан
Под возможность вернуть из подзапроса tuple тоже вроде бы тикет есть...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939206
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

может там всё таки есть тикет про векторные cравнения? типа

Код: sql
1.
2.
3.
select *
from T
where (a, b) IN (select c, d from T2)



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

Да, вот с LEFT JOIN LATERAL красиво получается, вот только немножко "ON 1=1" смущает :)
Или в CTE чтоб можно было подсунуть параметр из мастера, но это тоже противоречит стандарту, ахинея типа

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with D as (
  select first 1
    D.ID, D.STAMP, D.DATA1, D.DATA2
  from DETAIL D
  where D.MASTER_ID = M.ID and D.STAMP <= :DST
  order by D.STAMP desc
)
select M.ID, D.STAMP, D.DATA1, D.DATA2
from TA_MASTER M, D
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939230
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисМне тяжело представить как из подзапроса который записывается в
предложении селект можно два и более поля вытащить
Я тоже не готов предложить готовый патч, но в принципе, там, где можно сформировать
сингуляр, можно сформировать и вектор.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939232
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис... Мне тяжело представить как из подзапроса который ...
Так Вы неправильно его готовьте :) Не в where такие, только в вверху такие или в крайнес случае
Код: sql
1.
where (a IN (select c, d from T2).c)


Новые дополнения к стандарту sql-15 скоро
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939233
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

это не только стандарту противоречит, но и здравому смыслу. Поскольку в CTE можно использовать только то что описано выше этой CTE.

ON 1=1 в LATERAL можно тоже опустить вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT
  M.ID,
  T.DATA1,
  T.DATA2
FROM MASTER M, LATERAL (select D.DATA1, D.DATA2 
                         from DETAIL D 
                         where D.MASTER_ID = M.ID and D.STAMP <= :DST 
                         order by D.STAMP desc ROWS 1) T
WHERE M.SLICE_ID = :SLC



Впрочем всё равно этого нет. Можешь проголосовать за этот тикет. Может когда-нибудь и появится.
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939243
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

ты не путай использование предикатов с векторами и использование векторов в самом SELECT.

Вот такой запрос
Код: sql
1.
2.
3.
4.
5.
select
  M.ID,
  (select first 1 D.DATA1, D.DATA2 from DETAIL D where D.MASTER_ID = M.ID and D.STAMP <= :DST order by D.STAMP desc)
 from MASTER M
where M.SLICE_ID = :SLC


должен означать, что подзапрос возвращает один столбец являющийся вектором, а не ещё 2 столбца. Даже если это будет реализовано, то по крайней мере придётся ещё переделывать драйвера и клиента для отображения таких столбцов
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939261
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,

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

Прям как щас работает select M.ONE, (select max(D.TWO) from DETAIL D where D.MASTER_ID = M.ID) from MASTER M

То что Вы говорите вообще нестед дата, помню было попытка у борланда такое сделать, компоненты были.
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939269
Dorin Marcoci
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче left join СП лучший вариант пока.
Тот же латерал только с боку :)

Вот у элефанта есть такое с 9.3
http://www.postgresql.org/docs/9.4/static/queries-table-expressions.html
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939270
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dorin Marcoci,

не это фигня. Про датасет это ты вообще зря сказал. Тип возвращаемого поля - вектор это ещё куда не шло. В принципе можно сделать что-то такое

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
with t as(
  select
    M.ID,
    (select first 1 D.DATA1, D.DATA2 from DETAIL D where D.MASTER_ID = M.ID and D.STAMP <= :DST order by D.STAMP desc) as v
  from MASTER M
  where M.SLICE_ID = :SLC)
select t.id, t.v.data1, t.v.data2
from t



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

LATERAL - это и есть сбоку. Перевод у него такой (боковой)
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939302
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисдолжен означать, что подзапрос возвращает один столбец являющийся
вектором, а не ещё 2 столбца.
А что ему, собственно, мешает вернуть два столбца? Или что мешает движку развернуть вектор
в отдельные столбцы при заполнении SQLDA?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939312
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

логика мешает. Любой подзапрос возвращает один филд, я могу ему алиас дать. Что потом с этим алиасом делать? Игнорировать? Получается "а тут рыбу заворачивали".

Что там в других СУБД по этому поводу?
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисЛюбой подзапрос возвращает один филд, я могу ему алиас дать. Что потом
с этим алиасом делать? Игнорировать?
Ну, например, выкидывать ошибку "два столбца с одинаковым именем".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Можно ли выполнить одним запросом?
    #38939560
Dorin Marcoci 3 сначала находит макс запись а потом другой запрос выбирает остальные поляникто не мешает сделать это всё однопроходным аггрегирующим запросом. По итогу, получится один проход с агрегацией по деталям + джойн к мастер-таблице...

другое дело - будет ли такое решение производительнее латерального подзапроса..
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Можно ли выполнить одним запросом?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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