![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Векторные запросы. Оракл и все остальные СУБД
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-), но я бы наверное копал в сторону подзапросов с агрегатами. По крайней мере это первое, что приходит на ум.