JOIN по нескольким ключам
В ON можно связать таблицы сразу по нескольким столбцам. Условия соединяют через AND. Это нужно в двух случаях: когда одного ключа мало, чтобы однозначно найти строку, и когда нужно дополнительно проверить данные. Работаем с таблицами Crunchbase.
Два условия в ON
Заголовок раздела «Два условия в ON»SELECT companies.permalink, companies.name, investments.company_name, investments.company_permalinkFROM tutorial.crunchbase_companies companiesLEFT JOIN tutorial.crunchbase_investments_part1 investments ON companies.permalink = investments.company_permalink AND companies.name = investments.company_name;Здесь строки соединяются, только если совпали и permalink, и название компании.
В наших данных результат такой же, как при соединении только по permalink: 128690 строк. Название везде совпадает с ключом, поэтому второе условие ничего не отсекает.
Зачем нужен второй ключ
Заголовок раздела «Зачем нужен второй ключ»- Составной ключ. Если строку определяют два столбца (например,
годистрана), нужны оба. - Проверка данных. Второе условие убирает ложные совпадения, если ключ в одной из таблиц загрязнён.
- Скорость. Иногда лишнее условие помогает базе быстрее найти строки. На маленьких таблицах эффект почти не виден.
Практика
Заголовок раздела «Практика»Решайте сами, без AI. Сначала напишите запрос, потом сверьтесь с проверкой, и только потом открывайте решение.
Задание 1
Заголовок раздела «Задание 1»Выполните LEFT JOIN таблицы tutorial.crunchbase_companies с tutorial.crunchbase_investments_part1 по двум ключам: permalink = company_permalink и name = company_name. Посчитайте строки результата.
Проверка: 128690.
Решение
SELECT COUNT(*) AS rows_countFROM tutorial.crunchbase_companies companiesLEFT JOIN tutorial.crunchbase_investments_part1 investments ON companies.permalink = investments.company_permalink AND companies.name = investments.company_name;Задание 2
Заголовок раздела «Задание 2»Соедините tutorial.crunchbase_companies и tutorial.crunchbase_acquisitions (INNER JOIN) по permalink = company_permalink и по категории: category_code = company_category_code. Посчитайте строки. Сравните с соединением только по permalink.
Проверка: с двумя ключами 5784, только по permalink 5941. Разница — 157 строк, где категория не совпала.
Решение
SELECT COUNT(*) AS two_keysFROM tutorial.crunchbase_companies companiesJOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalink AND companies.category_code = acquisitions.company_category_code;
SELECT COUNT(*) AS one_keyFROM tutorial.crunchbase_companies companiesJOIN tutorial.crunchbase_acquisitions acquisitions ON companies.permalink = acquisitions.company_permalink;