powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос!
8 сообщений из 8, страница 1 из 1
Запрос!
    #39047373
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет Всем! У меня такая ситуация, хотя можно её решить др способом, но слишком уж интересно стало. Есть таблица клиентов и их платежи, таблица платежей. Задача, получить одним запросом всех клиентов (id,fio,dr ....) + последний платеж (pay_date, pay_sum).

В db2 это можно было сделать так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select c.*, p.*
from customer c
, table(
select p.* 
from payment p 
where p.cust_id=c.cust_id 
order by 
--p.pay_date desc
p.pay_id desc
fetch first 1 row only) p;



Но в postgresql так не получается! Как можно это сделать!?
...
Рейтинг: 0 / 0
Запрос!
    #39047375
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот тема в которой это решилось!
...
Рейтинг: 0 / 0
Запрос!
    #39047381
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николаха,

Курить LIMIT вместо FETCH ...
LATERAL вместо table()
и взять LEFT JOIN LATERAL () ON TRUE
...
Рейтинг: 0 / 0
Запрос!
    #39047409
Фотография vyegorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николаха,

Код: sql
1.
2.
3.
4.
5.
SELECT DISTINCT ON (c.id)
       c.*, p.*
  FROM customer c
  JOIN payment p ON p.cust_id=c.cust_id
 ORDER BY c.id, p.pay_id DESC



Конструкция `DISTINCT ON` специфична для Postgres'а и требует ORDER BY.
...
Рейтинг: 0 / 0
Запрос!
    #39047419
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq, Еееееее..... Спасибо!!! )))))))))))

А что такое ON TRUE !?
...
Рейтинг: 0 / 0
Запрос!
    #39047422
Николаха
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vyegorov,

Тоже вариант! ))))

А какой запрос будет менее ресурсо затратным для сервера, если кол-во записей в таблице клиентов перевалит за 50 000, а таблица платежей, при условии что база ведется с начала тек года, 50 000*12 мес !?
...
Рейтинг: 0 / 0
Запрос!
    #39047452
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Николахаvyegorov,

Тоже вариант! ))))

А какой запрос будет менее ресурсо затратным для сервера, если кол-во записей в таблице клиентов перевалит за 50 000, а таблица платежей, при условии что база ведется с начала тек года, 50 000*12 мес !?
эти объёмы можно сгенерировать руками за 5 минут на тестовом сервере
заодно и выкурить explayn analyze
не забыть об индексах -- без них -- всё несколько иначе (без индексов выиграет скорее всего distinct on или вообще какая-нть аналитика)

ON -- это ON сабкляуза кляузы join
left там для неплательщиков



по секрету скажу, что будь distinct on в планере реализован по человечьи -- он не отличался бы (в случае большого числа правильно проиндексированных платежей) планом от lateral . но оптимайзер пж тут пока не запинали (и вообще отсутствие миллионов индусов не на пользу планеру), зато синтаксис позволяет это все руками
...
Рейтинг: 0 / 0
Запрос!
    #39047459
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS
при всего по 10-12 платежей в одно рыло -- полный скан по платежам с unique после хеш-джойна и сорта [т.е. distinct on] скорее таки выиграет. тут варианты. но будет тоже не быстрым.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Запрос!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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