powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка из 2 таблиц
6 сообщений из 6, страница 1 из 1
Выборка из 2 таблиц
    #39422248
Mr.Andersson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеются 2 таблицы: coursework cw и delivery dl . Одной записи cw может соответствовать несколько dl .
Как составить запрос, чтобы выбирались все записи из cw и для каждой из них выбиралась одна из dl так, чтобы dl.deliverydate была минимальной и возможно ли?

Пытался сделать так:
Код: sql
1.
2.
3.
4.
5.
SELECT cw.id, cw.theme, MIN(dl.deliverydate), dl.score
FROM coursework cw
LEFT JOIN delivery dl ON cw.id = dl.coursework
GROUP BY cw.id
ORDER BY cw.id

но столбец "dl.score" должен фигурировать в предложении GROUP BY или использоваться в агрегатной функции.
Если сделать агрегатную, то вывод будет некорректным, а если группировать, то выводятся все записи из dl .
...
Рейтинг: 0 / 0
Выборка из 2 таблиц
    #39422257
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Andersson,

старых рецептов полно. нео. но нынче в моде [LEFT JOIN] lateral (SELECT ... + order by ...[desc|asc] + limit 1).
...
Рейтинг: 0 / 0
Выборка из 2 таблиц
    #39422263
Mr.Andersson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq,

можно поподробнее на конкретном примере?
...
Рейтинг: 0 / 0
Выборка из 2 таблиц
    #39422281
Mr.Andersson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
разобрался. Получилось вот так:
Код: sql
1.
2.
3.
SELECT cw.id, cw.theme, dl.deliverydate, dl.score
FROM coursework cw
LEFT JOIN LATERAL (SELECT * FROM delivery WHERE coursework = cw.id ORDER BY deliverydate LIMIT 1) dl ON coursework = cw.id
...
Рейтинг: 0 / 0
Выборка из 2 таблиц
    #39422380
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mr.Anderssonразобрался. Получилось вот так:
Код: sql
1.
2.
3.
SELECT cw.id, cw.theme, dl.deliverydate, dl.score
FROM coursework cw
LEFT JOIN LATERAL (SELECT * FROM delivery WHERE coursework = cw.id ORDER BY deliverydate LIMIT 1) dl ON coursework = cw.id



Альтернативный вариант c DISTINCT ON

Код: plsql
1.
2.
3.
4.
5.
6.
SELECT cw.id, cw.theme, dl.deliverydate, dl.score
FROM coursework cw
LEFT JOIN (
   SELECT DISTINCT ON (dl.coursework) dl.coursework, dl.deliverydate, dl.score FROM delivery dl ORDER BY dl.coursework, dl.deliverydate
) AS dl ON cw.id = dl.coursework
ORDER BY cw.id, cw.theme



Какой из 2 вариантов будет быстрее - зависит от размеров таблиц, наличных индексов и прочих условий в запросе.
При полном объединении 2х таблиц подозреваю что скорее все таки join / distinct on.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
Выборка из 2 таблиц
    #39422426
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukПри полном объединении 2х таблиц подозреваю что скорее все таки join / distinct on.

--
Maxim Boguk

если 1-я табличка на пару порядков и более короче 2-й -- уже сомнительно.


а так, для сравнимых, -- да -- дистинкт с сортом по полному набору будет видимо дешевле нестед--лупа. если конечно пж (для лейтерела) на хеш--джойн сам не перейдёт. (там, навскидку, почти возможно. без лимитов он что--то такое точно умеет).
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Выборка из 2 таблиц
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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