Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не получается запрос по двум таблицам [D6, Paradox]


vcv ©   (2003-01-06 17:55:00) 

Народ! Помогите сделать запрос или выяснить, что это невозможно.
Задача такая:
Есть две таблицы (DBase или Paradox), в первой хранятся, к примеру, наименования налогов (поля ID, Title), во второй - ставки на конкретные даты (поля ID, Date, Rate).
То есть, например, если в декабре 2002 ставка по конкретному налогу была изменена, во второй таблице появляется запись:
<ID_налога>, "01.12.2002", <ставка>

Хочется получить выборку одним запросом на конкретную дату с полями Title, Rate.
Если отчетный месяц у нас, к примеру, январь 2003, а записи во второй таблице за январь нет, берутся ставки за ближайший ранний месяц.

Двумя связанными TQuery сделать получается легко. А можно ли одним?


Johnmen   (2003-01-08 10:00:00) [1]

Так проще и быстрее :
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


Johnmen   (2003-01-08 09:11:00) [2]

>Сергєєв Володимир © (06.01.03 18:30)
>...Да и третий диалект - это сила...

"В чем сила, брат ?"


vcv   (2003-01-08 08:16:00) [3]

Борландовский 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


Сергєєв Володимир   (2003-01-06 19:43:00) [4]

Че-то я не понял, кто хочет GROUP BY ? И на фиг он ему ? Хотя, кто его знает. А попробуй неявно при помощи ORDER BY.


vcv   (2003-01-06 19:25:00) [5]

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"? База одна, никаких гетерогенных связей не надо.


asmith   (2003-01-06 18:32:00) [6]

Можно, почитай "Heterogeneous joins" в Local SQL Help


Сергєєв Володимир   (2003-01-06 18:30:00) [7]

Не знаю, На МежОснове (англ. InterBase) это все легко можно было сделать на хранимых процедурах. Да и третий диалект - это сила. Попробуй

SELECT
TABLE1.ID,
TABLE1.TITLE,
MAX(TABLE2.DATE),
TABLE2.RATE
FROM
TABLE1,
TABLE2
WHERE
(TABLE2.ID = TABLE1.ID)

Не уверен, что проканает. Но это только если те требуется взять все налоговые ставки "прямо сейчас". А если у тя будет запись во второй таблице с датой позже, чем "сейчас", то фигня выйдет.


Наверх

Титульная страница Поиск, карта сайта Написать письмо