Настройка таблиц
Мы научимся использовать эту функцию на примере базы данных матчей ATP от TennisMyLife. Мы будем обрабатывать 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:winner_seed имеет разные типы в разных таблицах:
variantType, чтобы проверить тип winner_seed в каждой строке, а затем variantElement, чтобы извлечь само значение.
Когда тип — String, мы приводим значение к числу, а затем выполняем сравнение.
Результат выполнения запроса показан ниже:
Из какой таблицы берутся строки при использовании merge?
Что, если мы хотим узнать, из какой таблицы берутся строки? Для этого можно использовать виртуальный столбец_table, как показано в следующем запросе:
walkover:
walkover значение NULL везде, кроме atp_matches_1990s.
Нам нужно обновить наш запрос, чтобы проверять, содержит ли столбец score строку W/O, если в столбце walkover значение NULL:
score — Array(String), нужно пройтись по массиву и найти W/O, а если у него тип String, можно просто искать W/O в строке.