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

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

Векторные запросы. Оракл и все остальные СУБД


Страницы:   1 2 3

ANB ©   (2008-02-08 12:48:00) 

В честь пятницу разомнем мозги ?
Классическая задача на векторные запросы.
Часто задают и частенько решения частные.
Имеем
Table1
(
 ID,
 F1,
 F2,
 F3,
 F4
)
и
Table2
(
 ID,
 F5,
 F6,
 F7,
 F8
)
Задача - выбрать все записи из Table1 и по одной, ей соответсвующей в Table2.
Если бы Table1 ссылалась на Table2 многие к одному - лефт джойн и полное счастье.
Однако проблема наоборот.
Добавляем в Table2 поле ID_Table1 (и соответствующий FK). Связка многие к одному.

Нужно - вытащить все записи из Table1 и все поля Table2, привязанные к таблице1, но только по одной записи (которая в группе имеет самое большое поле F5).

Кто как это делает в разных субд ?


Кщд   (2008-02-11 06:41:00) [41]

Oracle

select t.id, t.f1, t.f2,
      t.f3, t.f4, t3.id,
      t3.id_table1, t3.f5,
      t3.f6, t3.f7, t3.f8
from table1 t
      left join
        (select t2.id_table1,
                max(t2.id) keep (dense_rank last order by t2.f5) id,
                max(t2.f5) keep (dense_rank last order by t2.f5) f5,
                max(t2.f6) keep (dense_rank last order by t2.f5) f6,
                max(t2.f7) keep (dense_rank last order by t2.f5) f7,
                max(t2.f8) keep (dense_rank last order by t2.f5) f8,                                                                    
        from table2 t2
        group by t2.id_table1
        ) t3
        on t.id = t3.id_table1


Petr V. Abramov   (2008-02-09 17:12:00) [42]


> ANB   (08.02.08 17:49) [8]


select *
from
 ( select *, max(f5) over (partition by table1_id) maxf5
   from t1, t2
   where t1.id = t2.table1_id
 )
where f5 = maxf5


ессно, будет выбрано не по одной записи из t2, а по столько, сколько записей имеют max значение для группы по table1_id, т.к. [9]


Johnmen   (2008-02-08 20:19:00) [43]


> ANB   (08.02.08 17:41) [5]

Тогда тебе надо определиться с

но только по одной записи (которая в группе имеет самое большое поле F5).

Если зн.полей полей одинаковы - не понятно, какую запись ты предпочитаешь из двух одинаковых :)))


ANB   (2008-02-08 17:49:00) [44]

Уточняю еще раз условие : результат запроса - все поля обоих таблиц.
Можно еще уточнить : внутри группы по ID_Table1 все поля неуникальны, кроме Table2(ID).
Ну сортировать по F5, F6, F7, ID


ANB   (2008-02-08 17:46:00) [45]


> select table2 from
> (select id_tabl1 as IDT,max(F5) mf5 from table2 GROUP BY
> id_tabl1) as t inner join table2 on table2.id_table1=t.idt
> and table2.f5=t.mf5

Это даже не скомпилится


Stas   (2008-02-08 17:44:00) [46]

ну и что?


ANB   (2008-02-08 17:41:00) [47]

Доп. условие - F5 не уникально.


Johnmen   (2008-02-08 14:33:00) [48]

SELECT * FROM T1, T2
WHERE (T1.ID=T2.ID) AND
((SELECT MAX(T2.F5) FROM T2 WHERE T1.ID=T2.ID) = T2.F5)

Почти не зависит от СУБД :)


Stas   (2008-02-08 14:10:00) [49]

ошибся так:
select table2 from
(select id_tabl1 as IDT,max(F5) mf5 from table2 GROUP BY id_tabl1) as t inner join table2 on table2.id_table1=t.idt and table2.f5=t.mf5


Stas   (2008-02-08 14:09:00) [50]

Если правильно понял, то так, как присоединить table1, думаю догадаться можно.

select table2 from
(select id_tabl1 as IDT,max(F5) mf5 from table2) as t inner join table2 on table2.id_table1=t.idt and table2.f5=t.mf5


Sergey13   (2008-02-08 13:50:00) [51]

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


Страницы:   1 2 3

Наверх

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