Самостоятельное присоединение SQL

Samostoatel Noe Prisoedinenie Sql



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

Однако в SQL существует тип соединения, который имеет тенденцию оставаться незамеченным и известен как самосоединение.

В SQL самообъединение — это мощный метод, который позволяет нам объединять строки из одной таблицы на основе связанного столбца в той же таблице.







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



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



По сути, самообъединение играет фундаментальную роль, когда вам нужно сравнить строки одной и той же таблицы.





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

ПРИМЕЧАНИЕ. Прежде чем мы углубимся, мы настроим базовую таблицу для демонстрационных целей. Однако вы можете использовать любой поддерживаемый набор данных.



Образец данных

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

СОЗДАТЬ ТАБЛИЦУ Продукты (
product_id INT ПЕРВИЧНЫЙ КЛЮЧ,
имя_продукта VARCHAR(255) НЕ НУЛЬ,
родительский_ид целое число
);

Добавьте в таблицу 10 образцов записей.

INSERT INTO Products (product_id, Product_name, Parent_id) ЗНАЧЕНИЯ
(1, «Электроника», NULL),
(2, «Смартфоны», 1),
(3, «Ноутбуки», 1),
(4, «Айфон 13», 2),
(5, «Samsung Galaxy S21», 2),
(6, «Макбук Про», 3),
(7, «Dell XPS 15», 3),
(8, «Аксессуары», NULL),
(9, «Чехлы для телефонов», 8),
(10, «Сумки для ноутбуков», 8);

Итоговая таблица выглядит следующим образом:

Пример 1. Базовое самостоятельное присоединение

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

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

ВЫБЕРИТЕ c.product_name КАК дочерний_продукт, p.product_name КАК родительский_продукт
ИЗ продуктов c
LEFT JOIN Продукты p ON c.parent_id = p.product_id;

В данном примере запроса мы используем «c» в качестве псевдонима для таблицы продуктов, которая представляет дочерние продукты.

Мы также создаем псевдоним «p» для таблицы продуктов, чтобы представить родительские продукты.

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

Наконец, мы используем предложение ON для создания связи между дочерними и родительскими записями, используя столбцы «parent_id» и «product_id».

Итоговая таблица выглядит следующим образом:

Вы заметите, что родительские продукты не имеют верхней ссылки, поскольку они находятся на вершине иерархии, также известной как корневые элементы.

Пример 2. Получение иерархических данных

Одна из наиболее фундаментальных ролей самосоединения — получение иерархических данных. Например, предположим, что мы хотим получить все дочерние продукты, где продукт равен «Аксессуары». Мы можем запустить запрос, используя самосоединение, следующим образом:

ВЫБЕРИТЕ c.product_name КАК дочерний_продукт
ИЗ продуктов c
ПРИСОЕДИНЯЙТЕСЬ к продуктам p ON c.parent_id = p.product_id
ГДЕ p.product_name = «Аксессуары»;

В этом случае мы используем JOIN, чтобы объединить таблицу продуктов сама с собой, а затем используем предложение WHERE, чтобы отфильтровать нужные нам результаты.

Заключение

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