Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / JOIN для таблиц со связью "один ко многим" / 8 сообщений из 8, страница 1 из 1
20.05.2008, 12:19
    #35322874
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
Добрый день. Что-то не могу сообразить.
Есть две таблицы - t1 и t2, связанные по полю id. Каждой записи в t1 соответствует несколько записей в t2. Нужно каждую запись в t1 связать с одной из записей в t2, которая оказалась первой при сортировке, например, по дате. То есть запрос должен выглядеть примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
 select t1.id, t1.f1, t2.f1
from t1
join ( select t2.id, t2.f1
        from t2
        where t1.id = t2.id
        order by t2.d
        limit  1 
      ) as tt2
on t1.id = tt2.id
Этот запрос, естественно, не работает. Ругается на "where t1.id = t2.id".
Пните в какую-нибудь сторону.
...
Рейтинг: 0 / 0
20.05.2008, 13:36
    #35323179
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
один из вариантов. не проверял.

select id, f1, ( select t2.f1 from t2 where t2.id = t1.id order by t2.date limit 1 ) as t2_f1 from t1
...
Рейтинг: 0 / 0
20.05.2008, 15:00
    #35323457
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
Спасибо, почти то, что нужно. Правда, мне из подзапроса нужно вернуть несколько полей, но это уже дело техники.
...
Рейтинг: 0 / 0
21.05.2008, 05:29
    #35324839
Бабичев Сергей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
_Андрей_МСпасибо, почти то, что нужно. Правда, мне из подзапроса нужно вернуть несколько полей, но это уже дело техники.Никто тебе не мешает снести подзапрос из секции SELECT в секцию FROM...
...
Рейтинг: 0 / 0
23.05.2008, 10:09
    #35330416
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
Получим тот-же join, только неявный. С примерно такой-же руганью
...
Рейтинг: 0 / 0
23.05.2008, 10:23
    #35330460
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
select * from t1 join ( select distinct on ( id ) * from t2 order by id, date ) using ( id );

еще можно попробовать с GROUP BY без DISTINCT ON
...
Рейтинг: 0 / 0
23.05.2008, 19:11
    #35332376
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
_Андрей_М пишет:
> select t1.id, t1.f1, t2.f1
> from t1
> join ( select t2.id, t2.f1
> from t2
> where t1.id = t2.id
> order by t2.d
> limit *1*
> ) as tt2
> on t1.id = tt2.id

Не в моих правилах писать запросы, так что считай, что тебе
повезло ... :-)

select t1.id, t1.f1, t2.f1
from t1 as t1
join t2 as t2 on t1.id = t2.id
and t2.d = ( select min(g.d) from t2 g where g.id = t1.id )

Но это будет работать только при уникальном поле "d" для всех записей в одной
группе с одинаковым значением "id".

Если конечно PG такое выдержит...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
28.05.2008, 09:56
    #35339228
_Андрей_М
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JOIN для таблиц со связью "один ко многим"
Ну раз даже MasterZiv нарушил свои принципы, придётся отчитаться о проделанной работе :-)
Конечно, реальный запрос несколько сложнее, чем приведённый пример. В моём случае самым быстрым оказался вариант с DISTINCT ON. Вариант SELECT ... (SELECT ...) оказался в 2 - 3 раза медленнее. Окончания выполнения запроса с MIN() дожидаться не стал, т. к. время превысило время DISTINCT ON, и смысла ждать дальше не было. Получается, что выгоднее выбрать два набора данных и связать их JOIN'ом, чем взять один набор, и выдёргивать для каждой его записи что-то из другого набора, вроде SELECT ... WHERE t1.id = (SELECT ... t1.id = t2.id ...)
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / JOIN для таблиц со связью "один ко многим" / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]