Любимые задачки по SQL, связь многие ко многим между таблицами и JOIN запрос на три таблицы

Home » postgres » Любимые задачки по SQL, связь многие ко многим между таблицами и JOIN запрос на три таблицы
postgres, SQL Комментариев нет

Любимые задачки по SQL, связь многие ко многим между таблицами и JOIN запрос на три таблицы

Довольно распространенной задачкой на знание SQL, встречающейся на собеседованиях(на вакансии любых программистов), является задачка на создание связи типа Многие-ко-Многим. (Задачку на связь один-ко-многим и теоретическую основу я раскрыл в предыдущей статье)
Условие примерно такое: есть две таблицы, например, таблица подразделений компании и таблица работников(можно и другой пример многих ко многим привести, например авторы и книги).

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

Интуитивно понятно, что двумя таблицами при решении этой задачи уже не обойтись. Это действительно так. Для связи многие-ко многим нам придется создать связывающую таблицу. Как нетрудно догадаться эта таблица будет содержать связи этих двух таблиц и состоять, как минимум из двух столбцов – 1) столбец с id первой таблицы 2) столбец с id второй таблицы. Соответственно в итоге мы должны получить 3 таблицы. Создадим их:

Соответственно, каждый работник или каждое отделение по которому мы будем искать информацию будет содержать от одной до нескольких записей и все записи будут содержать различные сочетания сотрудников и подразделений.

Ну а теперь… Попробуем вытащить с помощью составного JOIN запроса всех, кто ковыряется в носу на рабочем месте. Думаете это сложно? Ничуть. Некоторые сходу пытаются писать огромные запросы. И в этом их ошибка. Тут нужен другой подход. Мы составим запрос JOIN многие ко многим к трем таблицам пошагово, и процедура окажется элементарной.
Как я уже сказал – главный секрет – в пошаговости… Именно поэтому операции и называются LEFT JOIN и RIGHT JOIN потому что они подразумевают, что люди конструирующие запросы будут составлять их постепенно, по кусочку, расставляя скобки для приоритетов и меняя RIGHT на LEFT и наоборот… итак.

data

Сначала соединим таблицу Department и таблицу Employed

в результате получим таблицу полученную слиянием этих двух:
join1

Затем заключим наш запрос в скобки и присоединим к нему еще один JOIN с таблицей Employee

теперь у нас воедино слиты все три таблицы:
join2

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

Получим:

Однако, список все еще содержит лишние данные, и много:
join3

Итак, собираем финальную версию:
SELECT Employee.emp_name FROM (Department JOIN Employed USING (dep_id)) JOIN Employee USING (emp_id) WHERE Department.dep_name = ‘отдел ковыряния в носу’;
Вуаля! Ничего лишнего! Это было очень просто.
join4

LEAVE A COMMENT