![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL для 3-х таблиц ? [D7, FireBird]
worldmen © (2005-09-19 12:49:00)Дано, таблицы (упрощенно):
Т1- таблица клиентов. Поля: idkl, Fam.
Т2, Т3- таблицы данных. Поля: id, data1, data2
Эти таблицы (Т2, Т3) одинаковые.
Нужно составить SQL таким образом: Т1 использует данные из Т2, но если есть по этому клиенту строка в Т3 - использовать данные из Т3.
worldmen (2005-09-20 17:41:00) [21]
> ANB ©
> - теперь ближе к делу. Запости, примерный результат того,
> что ты хочешь увидеть и я запостю запрос.
Я хочу сразу выбрать одним запросом тех кто идет по ведомости, а потом тех кого в ведомости нет, т.е. данные для нихбудут браться из часов дающихся на год (плановых).
> Sergey13 ©
> А при том как ты хочешь сделать непонятно что это - то что
> должно быть или то что есть.
Это я так хотел бы. Может я неправильно мыслю.
Я попробую все ваши советы и сообщу потом.
Os (2005-09-20 12:50:00) [22]> - А я и не знал, что так можно: if (t3hour is null) then t3houre= :t2houre/10
Проверено электроникой
SET TERM ^ ;
CREATE PROCEDURE TEST
RETURNS (
INAME VARCHAR(20),
IT2HOUR1 INTEGER,
IT3HOUR1 INTEGER)
AS
begin
for
Select t1.Name, t2.Hour1, t3.hour1 from Table1 t1, Table2 t2
left join table3 t3 on t3.id=t2.id
where t1.Id=t2.id into :iName, :it2Hour1, :it3Hour1
do
begin
if (it3Hour1 is null) then it2Hour1= :it2Hour1/10;
suspend;
end
end
^
ANB (2005-09-20 12:23:00) [23]Во, сообразил. union all тебя спасет :
select idkl, hour1, hour2, hour3, hour4 from T1, T3
where T3.idkl = T1.idkl
union all
select idkl, hour1, hour2, hour3, hour4 from T1, T2
where T2.idkl = T1.idkl and not exists (select 1 from T3 where T3.idkl = T1.idkl)
Примерно так. Дальше можешь агрегировать и по всякому изгалится с условиями.
ANB (2005-09-20 12:20:00) [24]
> worldmen © (20.09.05 12:08) [12]
- теперь ближе к делу. Запости, примерный результат того, что ты хочешь увидеть и я запостю запрос.
Sergey13 (2005-09-20 12:13:00) [25]2[12] worldmen © (20.09.05 12:08)
> А это я не понял:
Плановые часы ты можешь выводить отдельно. Фактические тоже. Что мешает совместить это в одном запросе. Просто фактические иногда будут пустые, если данных нет. И все сразу видно. А при том как ты хочешь сделать непонятно что это - то что должно быть или то что есть.
Это просто совет по реализации, а не ответ на твой конкретный вопрос.
worldmen (2005-09-20 12:08:00) [26]
> Я бы подумал о совмещении инфы из таблиц.
План на год подается раз в год (Т2), а в Т3 - ежемесячно.
Т2 -
| idkl | hour1 | hour2| hour3| hour4 | UchYear |
1 150 200 160 170 2005
2 120 160 140 200 2005
UchYear - учебный год, т.е. начало учебного года.
T3
| idkl | hour1 | hour2| hour3| hour4 | data |
1 20 15 30 25 200509
дата в формате YYYYMM.
> Еще вопросик - это, часом не домашнее задание ?
Не, на полставки в училище культуры работаю.
> Select t1.Name, t2.hour1, t3.hour1 from Table1 t1, Table2
> t2
> left join Table3 t3 on t3.id=t2.id
> where t1.id=t2.id into :id, :t2hour, :t3houre;
> if (t3hour is null) then t3houre= :t2houre/10
- А я и не знал, что так можно: if (t3hour is null) then t3houre= :t2houre/10
А это я не понял:
> Я имел в виду не изменение структуры (хотя и она возможна
> при таком раскладе), а просто совместный вывод из них и
> плана и факта.
Sergey13 (2005-09-20 11:43:00) [27]2[10] Os © (20.09.05 11:36)
Я имел в виду не изменение структуры (хотя и она возможна при таком раскладе), а просто совместный вывод из них и плана и факта.
Os (2005-09-20 11:36:00) [28]Процедурой в базе
Select t1.Name, t2.hour1, t3.hour1 from Table1 t1, Table2 t2
left join Table3 t3 on t3.id=t2.id
where t1.id=t2.id into :id, :t2hour, :t3houre;
if (t3hour is null) then t3houre= :t2houre/10
......
Возврат :id, :t3houre
Sergey13 очень прав пересмотри структуру
ANB (2005-09-20 11:23:00) [29]Уточни еще :
- где в T3 номер месяца ?
- В каком виде хочешь получить запрос ?
- В середине года в T2 так и лежат часы за прошлый год или там копится сумма ?
- сколько записей в T2 и Т3 на одного преподавателя ?
Имхо - в оракле сделать одним запросом можно, потом под FB отладишь, особых наворотов тут не надо.
Еще вопросик - это, часом не домашнее задание ?
Sergey13 (2005-09-20 11:08:00) [30]Я бы подумал о совмещении инфы из таблиц. Типа давать и план и факт. Это вроде и показательнее даже. А так... Ну ХП напиши. Одним запросом вряд ли.
ИМХО.
pasha_golub (2005-09-20 11:04:00) [31]А нельзя ли T3 сделать View'хой и не мучатцо?
worldmen (2005-09-20 11:02:00) [32]Передо мной стоит задача:
есть таблица преподавателей - Т1,
в Т2 заносятся данные по начитке часов на год (заносятся в начале учебн. года) - эти часы я потом делю на месяцы (10 месяцев) и знаю сколько преподаватель вычитал часов;
в Т3 - ведомость по часам- подается каждый месяц. Т.е. в Т3 есть данные за этот месяц - надо брать их.
Подробнее :
Т1 - таблица общих данных по клиенту:
| idkl | Fam | Imy | и т.д.
1 Иванов Иван ...
2 Петров ... ...
--------------------------
Т2 -
| idkl | hour1 | hour2| hour3| hour4 |
1 150 200 160 170
2 120 160 140 200
------------------------------
T3
| idkl | hour1 | hour2| hour3| hour4 |
1 20 15 30 25
для Иванова - используем часы: 20ч. 15ч. 30ч. 25ч.
а для Петрова : 120/10 160/10 140/10 200/10
связка типа - Where T1.idkl = T2.idkl - ничего недает.
А вот про это я забыл:
> 2. Читать про JOIN и EXISTS
Надо попробовать.
Plague (2005-09-19 12:59:00) [33]напиши подробнее... какие данные лежат в t1,2 и "Т1 использует данные из Т2" это типа если idkl=t2.id? и "если есть по этому клиенту строка в Т3 " это idkl=t3.id??
ANB (2005-09-19 12:57:00) [34]К 2. И CASE
ANB (2005-09-19 12:56:00) [35]1. ТЗ не полное. (не понятно, по какому принципу Т1 использует данные из Т2и что вообще нужно получить в результате)
2. Читать про JOIN и EXISTS
3. Лучше так не делать (будет тормозить)
msguns (2005-09-19 12:56:00) [36]Скорее where
Os (2005-09-19 12:55:00) [37]ispolsuj joini analiziruj v programme