Окончательное решение, которое я мог бы найти, ниже , я пытаюсь идти, хотя логические шаги, которые потребовались мне, чтобы добраться туда.
Это в T-SQL. (SQL Server 2016)
Укажите, в каких регионах работает компания
SELECT company_name, COUNT(works_in.region_id) AS count FROM companies
LEFT JOIN works_in ON works_in.company_id = companies.company_id
GROUP BY company_name
Результат примерно такой (данные испытаний включены ниже):
![Results](https://i.stack.imgur.com/1kZ3F.png)
Посмотрите, какие границы имеет определенный регион:
SELECT DISTINCT region_id1, region_id2 FROM region_borders
INNER JOIN works_in w1 ON region_borders.region_id1 = w1.region_id
INNER JOIN works_in w2 ON region_borders.region_id2 = w2.region_id
WHERE (region_id1 = 1 OR region_id2 = 1)
![enter image description here](https://i.stack.imgur.com/IMcVD.png)
Список соседних регионов, в которых работает компания:
SELECT * from regions where exists (SELECT region_id1, region_id2 FROM region_borders
INNER JOIN works_in w1 ON region_borders.region_id1 = w1.region_id
INNER JOIN works_in w2 ON region_borders.region_id2 = w2.region_id
WHERE (region_id1 = regions.region_id OR region_id2 = regions.region_id)
AND w1.company_id = 4
AND w2.company_id = 4)
Это для компании 4, это будет обобщено позже.
![enter image description here](https://i.stack.imgur.com/WoMdc.png)
Собираем все вместе:
SELECT company_name, COUNT(works_in.region_id) AS count FROM companies
LEFT JOIN works_in ON works_in.company_id = companies.company_id
WHERE EXISTS (
SELECT region_id1, region_id2 FROM region_borders
INNER JOIN works_in w1 ON region_borders.region_id1 = w1.region_id
INNER JOIN works_in w2 ON region_borders.region_id2 = w2.region_id
WHERE (region_id1 = works_in.region_id OR region_id2 = works_in.region_id)
AND w1.company_id = companies.company_id
AND w2.company_id = companies.company_id
)
GROUP BY company_name
HAVING COUNT(works_in.region_id) = 3
Здесь перечислены компании, которые работают в 3 смежных регионах. Я выбрал фактические результаты, которые вам нужны , вы должны быть в состоянии развить это и закончить упражнение.