Что-то вроде:
select
i.id, i.comment,
min(wd.date) as invoice_range_from, max(wd.date) as invoice_range_to
from invoice i
left join workdays wd on i.id = wd.invoice_id
group by i.id
order by min(wd.date), max(wd.date)
Если вы хотите получить своих родителей-детей за один прием в оба конца, используйте возможности JSON или XML вашей СУБД, особенно если ваше клиентское приложение все равно будет использовать JSON, вы можете использовать следующее. например.,
Тест в реальном времени: https://dbfiddle.uk/?rdbms=postgres_11&fiddle=0b1ce002c4380a3542387209c3c43fae
select
i.id, i.comment,
min(wd.date) as invoice_from, max(wd.date) as invoice_to,
json_agg(json_build_object('date', wd.date)) as workdays_data
from invoice i
left join workdays wd on i.id = wd.invoice_id
group by i.id
order by min(wd.date), max(wd.date)
Выход:
id comment invoice_from invoice_to workdays_data
1 Hello 2019-01-02 2019-01-03 [{"date" : "2019-01-02"}, {"date" : "2019-01-03"}]
2 Hola 2019-01-05 2019-01-06 [{"date" : "2019-01-05"}, {"date" : "2019-01-06"}]
В противном случае вам придется использовать возможности дозирования вашего ORM. Если у вас нет подходящей ORM, вам нужно вручную сделать запрос минимизировать количество обращений к серверу.
Если вы хотите использовать все возможности JSON вашей СУБД для рендеринга древовидных данных за один раз, вы можете:)
Тест в реальном времени: https://dbfiddle.uk/?rdbms=postgres_11&fiddle=1ed3105719ed033ba568e01b3d97c234
with a as
(
select
i.id, i.comment,
min(wd.date) as invoice_range_from, max(wd.date) as invoice_range_to,
json_agg(json_build_object('date', wd.date)) as workdays_data
from invoice i
left join workdays wd on i.id = wd.invoice_id
group by i.id
order by min(wd.date), max(wd.date)
)
select json_agg(a.*) from a;
Выход:
[
{
"id": 1,
"comment": "Hello",
"invoice_range_from": "2019-01-02",
"invoice_range_to": "2019-01-03",
"workdays_data": [
{
"date": "2019-01-02"
},
{
"date": "2019-01-03"
}
]
},
{
"id": 2,
"comment": "Hola",
"invoice_range_from": "2019-01-05",
"invoice_range_to": "2019-01-06",
"workdays_data": [
{
"date": "2019-01-05"
},
{
"date": "2019-01-06"
}
]
}
]
Схема:
create table invoice
(
id int primary key,
comment text not null
);
create table workdays
(
invoice_id int not null references invoice(id),
id int not null generated by default as identity primary key,
date date not null
);
insert into invoice(id, comment) values
(1, 'Hello'),
(2, 'Hola');
insert into workdays(invoice_id, date) values
(1, '2019-1-2'),
(1, '2019-1-3'),
(2, '2019-1-5'),
(2, '2019-1-6');