Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Можно ли выполнить одним запросом? / 23 сообщений из 23, страница 1 из 1
17.04.2015, 11:37
    #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
17.04.2015, 12:28
    #38939061
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли выполнить одним запросом?
Dorin MarcociПробовал с CTE, derived tables
Ничё себе. Начни с малого: описание оператора SELECT. Пойми, как с помощью него можно выбрать данные из нескольких таблиц. JOIN и прочее.
...
Рейтинг: 0 / 0
17.04.2015, 12:42
    #38939091
Можно ли выполнить одним запросом?
Dorin Marcoci,

Тынц . Способы 1,2,3,4,5 должны работать и в твоей версии СУБД
...
Рейтинг: 0 / 0
17.04.2015, 13:00
    #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
17.04.2015, 13:15
    #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
17.04.2015, 13:25
    #38939154
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли выполнить одним запросом?
Симонов Денис,

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

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

Спасибо всем!
...
Рейтинг: 0 / 0
17.04.2015, 13:27
    #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
17.04.2015, 13:28
    #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
17.04.2015, 13:39
    #38939185
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли выполнить одним запросом?
Симонов Дениспод него даже тикет сделан
Под возможность вернуть из подзапроса tuple тоже вроде бы тикет есть...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.04.2015, 13:50
    #38939206
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли выполнить одним запросом?
Dimitry Sibiryakov,

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

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



Мне тяжело представить как из подзапроса который записывается в предложении селект можно два и более поля вытащить
...
Рейтинг: 0 / 0
17.04.2015, 13:57
    #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
17.04.2015, 14:02
    #38939230
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли выполнить одним запросом?
Симонов ДенисМне тяжело представить как из подзапроса который записывается в
предложении селект можно два и более поля вытащить
Я тоже не готов предложить готовый патч, но в принципе, там, где можно сформировать
сингуляр, можно сформировать и вектор.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
17.04.2015, 14:02
    #38939232
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли выполнить одним запросом?
Симонов Денис... Мне тяжело представить как из подзапроса который ...
Так Вы неправильно его готовьте :) Не в where такие, только в вверху такие или в крайнес случае
Код: sql
1.
where (a IN (select c, d from T2).c)


Новые дополнения к стандарту sql-15 скоро
...
Рейтинг: 0 / 0
17.04.2015, 14:04
    #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
17.04.2015, 14:10
    #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
17.04.2015, 14:20
    #38939261
Dorin Marcoci
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли выполнить одним запросом?
Симонов Денис,

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

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

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

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

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

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

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

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


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