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_id | sku_name | parent_id |
---|---|---|
1 | Lilieth Bed | 4 |
2 | Holloway Desk | 3 |
3 | Basic Desk | null |
4 | Basic Bed | null |
И этот запрос, использующий самосоединение для добавления 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_id | sku_name | parent_id | parent_name |
---|---|---|---|
1 | Lilieth Bed | 4 | Basic Bed |
2 | Holloway Desk | 3 | Basic Desk |
3 | Basic Desk | null | null |
4 | Basic Bed | null | null |
Случаи использования самосоединения в SQL
Опять же, самосоединения, вероятно, редки в вашем проекте dbt и чаще всего будут использоваться в таблицах, содержащих иерархическую структуру, например, состоящих из столбца, который является внешним ключом к первичному ключу той же таблицы. Если у вас есть случаи использования самосоединений, как в приведенном выше примере, вы обычно захотите выполнить это самосоединение на ранних этапах в вашем , например, в ст ейджинговой или промежуточной модели; если ваша необработанная, несоединенная таблица будет использоваться дальше по потоку без самосоединения, это самосоединение должно происходить в модульной промежуточной модели.
Вы также можете использовать самосоединения для создания декартова произведения (также известного как перекрестное соединение) таблицы с самой собой. Опять же, редкие случаи использования, но они все же существуют, если вам это нужно 😉