будет использовать LEFT ARRAY JOIN.
CREATE OR REPLACE TABLE t_demo (
created_at DateTime64(3, 'Europe/Moscow'),
id UInt64,
col1 String,
body Nested (
id Nullable(UInt64),
col2 String,
col3 Int8,
col4 Nullable(Int8),
modified_at Nullable(DateTime64(3, 'Europe/Moscow'))
)
)
ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (created_at, id)
;
SELECT *
FROM `default`.t_demo
LEFT ARRAY JOIN body
;
Однако есть неудобство, что при заливке данных через JSON нужно указывать все поля, принадлежащие Nested полю, и в том же порядке, в котором они объявлены. Но если сделать каждое поле в отдельности массивом, то LEFT ARRAY JOIN можно применить только к одному из Array полей и нельзя написать несколько раз подряд LEFT ARRAY JOIN.
CREATE OR REPLACE TABLE t_demo (
created_at DateTime64(3, 'Europe/Moscow'),
id UInt64,
col1 String,
`body_id` Array(Nullable(UInt64)),
`body_col2` Array(String),
`body_col3` Array(Int8),
`body_col4` Array(Nullable(Int8)),
`body_modified_at` Array(Nullable(DateTime64(3, 'Europe/Moscow')))
)
ENGINE = ReplacingMergeTree()
PARTITION BY toYYYYMM(created_at)
ORDER BY (created_at, id)
;
SELECT *
FROM `default`.t_demo
LEFT ARRAY JOIN `body.id` --Выполниться успешно
-- LEFT ARRAY JOIN `body.col2` --Будет выброшено исключение, если раскоментировать
;
Что можно предпринять, чтобы можно было?:
- в JSON не указывать все Array поля;
- менять порядок Array полей.
LEFT ARRAY JOIN body.id as id, body.col2 as col2
Огонь! Благодарю!
А насколько равноценны SELECT запросы для обеих ситуаций?
Обсуждают сегодня