Как объединить данные из двух таблиц с разной заполненностью адреса и цены в SQL
Что проверяют
Умеете ли вы собрать одну запись об объекте из двух неполных источников, не потеряв строки и не размножив их. Интервьюеру важно, какой join вы выберете, по какому ключу склеите и что сделаете, когда значения расходятся. Следом обычно спрашивают про дубли в одном из источников.
Как отвечать
Уточните, есть ли общий ключ и может ли объект быть только в одной таблице. Если может, нужен FULL OUTER JOIN, иначе потеряете объекты одного из источников:
SELECT COALESCE(a.id, b.id) AS id,
COALESCE(a.address, b.address) AS address,
COALESCE(a.price, b.price) AS price
FROM a FULL JOIN b ON a.id = b.id;- приоритет источника: порядок аргументов в
COALESCEи есть правило, чьё значение главнее. Если оба заполнены и расходятся, договоритесь: надёжный источник или самая свежая запись поupdated_at; - дедупликация до join: если на объект приходится несколько строк, оставьте одну через
ROW_NUMBER() OVER (PARTITION BY id ORDER BY updated_at DESC), иначе join даст произведение строк; - пустые значения: пустую строку превратите в NULL через
NULLIF(TRIM(address), ''), иначеCOALESCEна ней остановится; - нет общего ключа: склеивают по нормализованному адресу или составному признаку, и это уже задача сопоставления с отдельной проверкой качества;
- много источников:
UNION ALLиGROUP BY id, ноMAXвыбирает по значению, а не по приоритету, так что источник нужно учитывать явно.
В MySQL FULL JOIN нет, его собирают из LEFT JOIN и UNION ALL с антиджойном.
Где спотыкаются
Берут ключ из одной таблицы: a.id вместо COALESCE(a.id, b.id). Строки, которые есть только во второй таблице, остаются без идентификатора.
Добавляют WHERE b.price > 0 после LEFT JOIN и незаметно превращают его во внутреннее соединение. Условие на правую таблицу пишут в ON или явно учитывают NULL.
Не проверяют результат. После склейки нужно сверить число строк с числом уникальных ключей и посчитать долю NULL по каждой колонке.