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

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

SQL для 3-х таблиц ? [D7, FireBird]


Страницы:   1 2

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


Страницы:   1 2

Наверх

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