Форум: "Базы";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Вниз
Не получается запрос по двум таблицам Найти похожие ветки
← →
vcv (2003-01-06 17:55) [0]Народ! Помогите сделать запрос или выяснить, что это невозможно.
Задача такая:
Есть две таблицы (DBase или Paradox), в первой хранятся, к примеру, наименования налогов (поля ID, Title), во второй - ставки на конкретные даты (поля ID, Date, Rate).
То есть, например, если в декабре 2002 ставка по конкретному налогу была изменена, во второй таблице появляется запись:
<ID_налога>, "01.12.2002", <ставка>
Хочется получить выборку одним запросом на конкретную дату с полями Title, Rate.
Если отчетный месяц у нас, к примеру, январь 2003, а записи во второй таблице за январь нет, берутся ставки за ближайший ранний месяц.
Двумя связанными TQuery сделать получается легко. А можно ли одним?
← →
Сергєєв Володимир (2003-01-06 18:30) [1]Не знаю, На МежОснове (англ. InterBase) это все легко можно было сделать на хранимых процедурах. Да и третий диалект - это сила. Попробуй
SELECT
TABLE1.ID,
TABLE1.TITLE,
MAX(TABLE2.DATE),
TABLE2.RATE
FROM
TABLE1,
TABLE2
WHERE
(TABLE2.ID = TABLE1.ID)
Не уверен, что проканает. Но это только если те требуется взять все налоговые ставки "прямо сейчас". А если у тя будет запись во второй таблице с датой позже, чем "сейчас", то фигня выйдет.
← →
asmith (2003-01-06 18:32) [2]Можно, почитай "Heterogeneous joins" в Local SQL Help
← →
vcv (2003-01-06 19:25) [3]To Сергєєв Володимир:
Это было бы очень просто если бы не ограничения LocalSQL.
На подобную конструкцию он требует явного указания GROUP BY
"GROUP BY is required when both aggregate and non-aggregate fields are used in result set." А при наличии GROUP BY начинает ругаться "When GROUP BY exists, every simple field in projectors must be in GROUP BY". И все, приехали. Убрать поле Rate из запроса я не могу, оно именно и нужно, и указать его в GROUP BY тоже нельзя, тогда получается куча групп, каждая из одной записи, ставка-то постоянно разная. И обмануть, поставив место поля Rate какую-нибудь формулу не удалось. "Expressions in group by are not supported." :-(
To asmith:
При чем тут "Heterogeneous joins"? База одна, никаких гетерогенных связей не надо.
← →
Сергєєв Володимир (2003-01-06 19:43) [4]Че-то я не понял, кто хочет GROUP BY ? И на фиг он ему ? Хотя, кто его знает. А попробуй неявно при помощи ORDER BY.
← →
vcv (2003-01-08 08:16) [5]Борландовский LocalSQL хочет, если в запросе есть агрегантые функции.
Спасибо за внимание, вопрос уже снят.
Решилось подобным запросом:
select ID,Title,ratesval."Date",Rate,Formula from rates join ratesval on (rates.ID=ratesval.RateID)
where CAST(ratesval.RateID as CHAR(10))||CAST(ratesval."Date" as CHAR(10)) in
(
select CAST(ratesval.RateID as CHAR(10))||CAST(MAX(ratesval."Date") as CHAR(10))
from ratesval
where ratesval."Date"<="01.01.2002" group by RateID
)
order by rates.Title
← →
Johnmen (2003-01-08 09:11) [6]>Сергєєв Володимир © (06.01.03 18:30)
>...Да и третий диалект - это сила...
"В чем сила, брат ?"
← →
Johnmen (2003-01-08 10:00) [7]Так проще и быстрее :
SELECT A.id, A.tit, B.d, B.s
FROM T1 A, T2 B
WHERE (A.id=B.id) AND
(B.d IN (SELECT MAX(d)
FROM T2
WHERE (id=A.id) AND (d<="01.01.2002")))
GROUP BY A.id, A.tit, B.d, B.s
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.01 c