@jenya7771

Как написать/дописать сложный SQL запрос?

Здравствуйте, у меня есть 3 таблицы:
number:
- id
- country

buy_number:
- id
- numberId
- serviceId

service:
- id
- name

Нужно написать запрос, с помощью которого я получу список не сервисов(service.name) и стран(number. country). Но сервисы нужно получить только те, которые еще не проданы(не находятся в таблице buy_number).

Я смог написать только так, я получаю список стран, для номеров которых есть еще не проданы сервисы:
SELECT
       pn.country
FROM number pn
    LEFT JOIN buy_number bn on pn.id = bn."numberId"
    LEFT JOIN service s on s.id = bn."serviceId"
GROUP BY pn.country
HAVING COUNT(DISTINCT bn."serviceId") < (SELECT COUNT(id) from service)

Проверку есть ли еще не проданы сервисы для номера или нет я делаю по условию в HAVING, если количество проданных сервисов для номера меньше чем всего сервисов есть в таблице service, то значит у данного номера есть еще свободные сервисы.

Нужно как-то дописать этот запрос, что бы я получал не только страны от номеров где есть не проданы сервисы, но и названия этих не проданы сервисов.

Спасибо!
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Используем CROSS JOIN
SELECT
	pn.country, array_agg(s.name) services
FROM number pn
CROSS JOIN service s
LEFT JOIN buy_number bn ON bn.numberId = pn.id AND bn.serviceId = s.id
WHERE bn.id is NULL
GROUP BY pn.country;


Проверить SQL
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы