Форум: "Начинающим";
Текущий архив: 2015.01.25;
Скачать: [xml.tar.bz2];
ВнизFireBird запрос к нескольким таблицами Найти похожие ветки
← →
Gedimen © (2013-12-23 19:51) [0]Доброго времени суток, господа форумчане.
Firebird 2.5 , Delphi XE5
Есть три таблицы:
t1 - виды тарифов;
t2 - цены тарифа и порядок образования цены (фиксированная, рассчитывается по базе и процентом от базы, вносятся на дату! (подчинена t1);
t3 - таблица с перечислениями: фиксированная, рассчитывается по базе, процентом от базы (значения используются в t2).
Собственно проблема в запросе к базе данных firebird. Уже всю голову сломал.
Нужно получить список всех тарифов (таблица t1) с последней ценой на дату (t2) и со значением порядка образования цены (t3).
t1.fname - наименование,
t2.fval - цена,
t2.fdate - дата значения,
t3.fname_val - порядок образованияSELECT t1.fname, t2.fval, t3.fname_val
FROM t1 LEFT JOIN t2 ON t2.id_t1 = t1.id LEFT JOIN t3 ON t3.id = t2.id_t3 WHERE t2.fdate<="31.12.2013"
В итоге получается примерно такая фигня:
Вид тарифа Цена Порядок образования цены
Тариф1 10,00 фиксированной суммой
Тариф1 12,00 фиксированной суммой
Тариф2 5,00 Расчет по базе
Тариф3 7,00 Расчет по базе
Тариф3 12,00 фиксированной суммой
Должна быть одна запись по каждому тарифу, т.е. последнее значение на дату. Может быть к t2 FIRST прикрутить можно?
Помогите, пожалуйста!
← →
anonims (2013-12-24 09:22) [1]
> одна запись по каждому тарифу, т.е. последнее значение на
> дату.select max(t2.date), t2.id from t2 group by t2.id
select t2.val, t2.date, t2.name from t2
inner join (select max(t2.date), t2.id from t2 group by t2.id ) as last
on last.id =t2.id and last.date =t2.dateselect t1.* ,
( select first 1 t2.name from t2 where t2.id =t1.id and t2.date<fixdate order by t2.date desc) as lastname,
( select first 1 t2.fdate from t2 where t2.id=t1.id and t2.date<fixdate order by t2.date desc) as lastdate
from t1 .....
← →
sniknik © (2013-12-24 09:48) [2]так не получится (fb поддерживает)?
SELECT t1.fname, t2.fval, t3.fname_val
FROM (SELECT id_t1, Max(fdate) AS fdate FROM t2 WHERE fdate<="31.12.2013" GROUP BY id_t1, fdate) AS t4
LEFT JOIN t1 ON t4.id_t1 = t1.id
LEFT JOIN t2 ON t4.id_t1 = t2.id AND t4.fdate = t2.fdate
LEFT JOIN t3 ON t2.id_t3 = t3.id
← →
sniknik © (2013-12-24 09:50) [3]а, ну да, fdate в GROUP BY лишний, нужен только id_t1.
← →
Gedimen © (2013-12-24 14:08) [4]Сделал так. А как по скорости такой запрос, а то есть сомнения?
SELECT t1.fname, t2.fval, t3.fname_val
FROM t1 LEFT JOIN t2 ON t2.id_t1=t1.id
LEFT JOIN t3 ON t3.id = t2.id_t3
WHERE t2.id = (SELECT FIRST 1 id FROM t2
WHERE id_t1 = t1.id AND t2.fdate<="31.12.2013")
← →
sniknik © (2013-12-24 15:43) [5]есть сомнения в правильности его работы... а в скорости сомнений нет, это будет самый медленный из возможных вариантов... ИМХО (не представляю как, но верю, что смогут и медленнее)
← →
Gedimen © (2013-12-24 16:02) [6]Спасибо. Сделаю как во втором ответе.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2015.01.25;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.002 c