Перейти к основному содержанию
Табличная функция Merge позволяет выполнять запросы к нескольким таблицам параллельно. Для этого она создает временную таблицу Merge и определяет ее структуру на основе объединения столбцов этих таблиц и вывода общих типов.

Настройка таблиц

Мы научимся использовать эту функцию на примере теннисного набора данных Джеффа Сакмана. Мы будем обрабатывать CSV-файлы с матчами начиная с 1960-х годов, но для каждого десятилетия создадим немного отличающуюся схему. Мы также добавим пару дополнительных столбцов для 1990-х годов. Ниже показаны команды импорта:

Схема нескольких таблиц

Мы можем выполнить следующий запрос, чтобы вывести столбцы каждой таблицы и их типы рядом — так различия будет проще увидеть.
Давайте рассмотрим различия:
  • В 1970-х тип winner_seed меняется с Nullable(String) на Nullable(UInt8), а score — с String на Array(String).
  • В 1980-х winner_seed и loser_seed меняются с Nullable(UInt8) на Nullable(UInt16).
  • В 1990-х surface меняется с String на Enum('Hard', 'Grass', 'Clay', 'Carpet'), а также добавляются столбцы walkover и retirement.

Запрос к нескольким таблицам с помощью merge

Давайте напишем запрос, чтобы найти матчи, в которых Джон Макинрой победил соперника, посеянного под № 1:
Далее предположим, что мы хотим отфильтровать эти матчи и найти те, где McEnroe был посеян под номером 3 или ниже. Это немного сложнее, потому что winner_seed имеет разные types в разных таблицах:
Мы используем функцию variantType, чтобы проверить тип winner_seed в каждой строке, а затем variantElement, чтобы извлечь само значение. Когда тип — String, мы приводим значение к числу, а затем выполняем сравнение. Результат выполнения запроса показан ниже:

Из какой таблицы берутся строки при использовании merge?

Что, если мы хотим узнать, из какой таблицы берутся строки? Для этого можно использовать виртуальный столбец _table, как показано в следующем запросе:
Мы также можем использовать этот виртуальный столбец в запросе, чтобы подсчитать значения в столбце walkover:
Мы видим, что в столбце walkover значение NULL везде, кроме atp_matches_1990s. Нам нужно обновить наш запрос, чтобы проверять, содержит ли столбец score строку W/O, если в столбце walkover значение NULL:
Если базовый тип scoreArray(String), нужно пройтись по массиву и найти W/O, а если у него тип String, можно просто искать W/O в строке.
Последнее изменение 2 июля 2026 г.