Запрос о компаниях и регионах - PullRequest
0 голосов
/ 16 ноября 2018

Я сейчас делаю некоторые упражнения по SQL.

У меня есть база данных с этой схемой:

CREATE TABLE regions(
region_id          INTEGER PRIMARY KEY,
region_name        TEXT NOT NULL,
number_of_customers INTEGER NOT NULL);

CREATE TABLE region_borders (
region_id1 INTEGER REFERENCES regions,
region_id2 INTEGER REFERENCES regions,
PRIMARY KEY (region_id1, region_id2));

CREATE TABLE companies (
company_id                  INTEGER PRIMARY KEY,
company_name                TEXT NOT NULL,
headquarters_region     INTEGER REFERENCES regions NOT NULL);

CREATE TABLE works_in(
company  INTEGER REFERENCES companies,
region_id  INTEGER REFERENCES regions,
PRIMARY KEY (company_id, region_id));

Я хочу перевести на SQL этот запрос:

«Извлеките компании, которые работают в трех разных регионах, у которых два на два имеют общую границу. Для каждой компании напишите название компании и названия трех регионов, которые имеют общие границы, в алфавитном порядке».

ХорошоЯ пытался работать с объединениями и группировкой, но мне удалось получить только названия компаний, которые работают в трех разных регионах.Я действительно понятия не имею о том, как реализовать этот запрос в SQL или реляционной алгебре.

Я использую PostgreSQL.

Спасибо за любые советы и помощь!

1 Ответ

0 голосов
/ 16 ноября 2018

Окончательное решение, которое я мог бы найти, ниже , я пытаюсь идти, хотя логические шаги, которые потребовались мне, чтобы добраться туда. Это в 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

Посмотрите, какие границы имеет определенный регион:

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

Список соседних регионов, в которых работает компания:

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

Собираем все вместе:

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 смежных регионах. Я выбрал фактические результаты, которые вам нужны , вы должны быть в состоянии развить это и закончить упражнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...