Оптимизация запроса с группировкой

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
vserd
Сообщения: 10
Зарегистрирован: 31 авг 2006, 17:15

Оптимизация запроса с группировкой

Сообщение vserd » 24 окт 2007, 10:28

Есть две таблицы, структура одинакова

Код: Выделить всё

CREATE TABLE VAL_DATE (
    ID        INTEGER NOT NULL,
    ID_OBJ    INTEGER NOT NULL,
    ID_PARAM  INTEGER NOT NULL,
    VAL       TIMESTAMP
);

CREATE TABLE VAL_TIME (
    ID        INTEGER NOT NULL,
    ID_OBJ    INTEGER NOT NULL,
    ID_PARAM  INTEGER NOT NULL,
    VAL       TIME
);
PRIMARY KEY (ID, ID_OBJ, ID_PARAM) для обоих.
Нужно определить ID записи для ближайшей меньшей даты
Написал я запрос:

Код: Выделить всё

select rd.id,  max (cast(rd.val as date) + cast(rt.val as time ) ) ts

from val_date rd left join val_time rt on  (Rt.id = rd.id)
where  (rd.id_obj = 148) and (rd.id_param = 5) and (Rt.id_param =7)
 and ((cast(rd.val as date) + cast(rt.val as time ))  <= '11.10.07 18:15:00')

group by 1
having    max(cast(rd.val as date) + cast(rt.val as time ))=
(select max (cast(rd1.val as date) + cast(rt1.val as time ) )
from val_date rd1 left join val_time rt1 on  (Rt1.id = rd1.id)
where  (rd1.id_obj = 148) and (rd1.id_param = 5) and (Rt1.id_param =7)
 and ((cast(rd1.val as date) + cast(rt1.val as time ))  <= '11.10.07 18:15:00'))
Но кажется мне что можно его проще написать....
Может кто подскажет как?

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 24 окт 2007, 10:52

Для чего LEFT JOIN? Записи о времени может не быть?

Код: Выделить всё

select first 1
  from ...
  order by ts desc

vserd
Сообщения: 10
Зарегистрирован: 31 авг 2006, 17:15

Сообщение vserd » 24 окт 2007, 11:08

Для чего LEFT JOIN? Записи о времени может не быть?
Запись о времени должна быть всегда. Но в жизни всякое случается.
В данном случае я не вижу большой разницымежду LEFT JOIN или where (Rt.id = rd.id) and .... Что явно, что не явно эти таблицы нужно объединять

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 окт 2007, 12:12

В данном случае я не вижу большой разницымежду
тогда читай www.ibase.ru/devinfo/joins.htm

left join и join - большая разница.

vserd
Сообщения: 10
Зарегистрирован: 31 авг 2006, 17:15

Сообщение vserd » 26 окт 2007, 16:30

WildSery
Спасибо, работает!!!

Ответить