71 lines
2.1 KiB
SQL
71 lines
2.1 KiB
SQL
|
|
-- Задачи на отработку Запросы - JOIN --
|
|
|
|
DROP TABLE IF EXISTS dsolovianov.products ON CLUSTER clickhouse_cluster SYNC;
|
|
DROP TABLE IF EXISTS dsolovianov.prices ON CLUSTER clickhouse_cluster SYNC;
|
|
|
|
CREATE TABLE dsolovianov.products
|
|
ON CLUSTER clickhouse_cluster
|
|
(
|
|
product_id UInt32,
|
|
name String
|
|
) ENGINE = ReplicatedMergeTree(
|
|
'/clickhouse/tables/{shard}/dsolovianov/products',
|
|
'{replica}'
|
|
)
|
|
ORDER BY product_id;
|
|
|
|
|
|
INSERT INTO dsolovianov.products VALUES
|
|
(101, 'iPhone 14'),
|
|
(102, 'Galaxy S22'),
|
|
(103, 'Pixel 7');
|
|
|
|
CREATE TABLE dsolovianov.prices
|
|
ON CLUSTER clickhouse_cluster
|
|
(
|
|
product_id UInt32,
|
|
price UInt32,
|
|
region String
|
|
) ENGINE = ReplicatedMergeTree(
|
|
'/clickhouse/tables/{shard}/dsolovianov/prices',
|
|
'{replica}'
|
|
)
|
|
ORDER BY product_id, region;
|
|
|
|
INSERT INTO dsolovianov.prices VALUES
|
|
(101, 999, 'US'),
|
|
(101, 1049, 'EU'),
|
|
(102, 850, 'US'),
|
|
(102, 899, 'CA'),
|
|
(103, 799, 'JP');
|
|
|
|
|
|
--№1 Сделай ANY LEFT JOIN, чтобы получить цену любой из регионов.
|
|
|
|
SELECT
|
|
p.product_id,
|
|
p.name,
|
|
pr.price,
|
|
pr.region
|
|
FROM dsolovianov.products AS p
|
|
ANY LEFT JOIN dsolovianov.prices AS pr ON p.product_id = pr.product_id;
|
|
|
|
--№2 Что будет, если в таблице `prices` несколько цен на один `product_id`?
|
|
|
|
/* Для одного product_id будет выбрана только первая ЛЮБАЯ (ANY) подходящая в поиске.*/
|
|
|
|
--№3 Как повлияет `ALL LEFT JOIN`? Почему в ClickHouse его избегают?
|
|
|
|
SELECT
|
|
p.product_id,
|
|
p.name,
|
|
pr.price,
|
|
pr.region
|
|
FROM dsolovianov.products AS p
|
|
ALL LEFT JOIN dsolovianov.prices AS pr ON p.product_id = pr.product_id;
|
|
|
|
/* `ALL LEFT JOIN` в Clickhouse ведет себя также, как LEFT JOIN в SQL, то есть собирает все совпадения.
|
|
Начинается перегон данных между таблицами. Из-за этого растет нагрузка на ОЗУ и CPU.
|
|
короче, по сути ALL LEFT JOIN создает декартово произведение*/
|