Перейти к основному содержимому

SQL SELF JOINS

Самое простое и одновременно самое запутанное соединение: самосоединение. Проще говоря, самосоединение позволяет соединить набор данных с самим собой.

Если вы новичок в работе с данными или SQL, вы можете задаться вопросом: зачем вообще это нужно? Разве соединения не должны происходить между несколькими разными сущностями?

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

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

Как создать самосоединение

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

select
<fields>
from <table_1> as t1
[<join_type>] join <table_2> as t2
on t1.id = t2.id

Поскольку вы можете выбрать диалект соединения для самосоединения, вы можете указать, хотите ли вы выполнить левое, внешнее, внутреннее, перекрестное или правое соединение в операторе соединения.

Пример самосоединения в SQL

Дана таблица products, которая выглядит следующим образом, где существует как первичный ключ (sku_id), так и внешний ключ (parent_id), ссылающийся на этот первичный ключ:

sku_idsku_nameparent_id
1Lilieth Bed4
2Holloway Desk3
3Basic Desknull
4Basic Bednull

И этот запрос, использующий самосоединение для добавления parent_name к skus:

select
products.sku_id,
products.sku_name,
products.parent_id,
parents.sku_name as parent_name
from {{ ref('products') }} as products
left join {{ ref('products') }} as parents
on products.parent_id = parents.sku_id

Этот запрос, использующий самосоединение, добавляет parent_name к skus, у которых parent_ids не равны null:

sku_idsku_nameparent_idparent_name
1Lilieth Bed4Basic Bed
2Holloway Desk3Basic Desk
3Basic Desknullnull
4Basic Bednullnull

Случаи использования самосоединения в SQL

Опять же, самосоединения, вероятно, редки в вашем проекте dbt и чаще всего будут использоваться в таблицах, содержащих иерархическую структуру, например, состоящих из столбца, который является внешним ключом к первичному ключу той же таблицы. Если у вас есть случаи использования самосоединений, как в приведенном выше примере, вы обычно захотите выполнить это самосоединение на ранних этапах в вашем , например, в стейджинговой или промежуточной модели; если ваша необработанная, несоединенная таблица будет использоваться дальше по потоку без самосоединения, это самосоединение должно происходить в модульной промежуточной модели.

Вы также можете использовать самосоединения для создания декартова произведения (также известного как перекрестное соединение) таблицы с самой собой. Опять же, редкие случаи использования, но они все же существуют, если вам это нужно 😉

0