Соединение трёх и более таблиц
Содержание курса
Псевдонимы таблиц и ошибка ambiguous column
Когда в запросе участвуют три таблицы, одно и то же имя столбца почти неизбежно встречается в нескольких из них. Классический пример — столбец id или суррогатные ключи вида customer_id, order_id, product_id: они есть и в основной таблице, и в связанной.
Если написать просто order_id без указания источника, SQLite не знает, из какой таблицы брать значение, и возвращает ошибку:
ambiguous column name: order_id
Решение — квалифицировать имя псевдонимом: o.order_id, oi.order_id. Псевдоним объявляется прямо в FROM или JOIN через ключевое слово AS:
SELECT c.name AS клиент,
o.order_date AS дата,
p.title AS товар
FROM customers AS c
JOIN orders AS o ON c.customer_id = o.customer_id
JOIN order_items AS oi ON o.order_id = oi.order_id
JOIN products AS p ON oi.product_id = p.product_id
ORDER BY c.name;
Здесь к разобранной выше цепочке добавлена четвёртая таблица customers, поэтому получилось три JOIN. Псевдонимы c, o, oi, p объявляются один раз и дальше используются везде: в SELECT, в условиях ON, в WHERE и ORDER BY. Полное имя таблицы после объявления псевдонима уже нельзя использовать — только псевдоним.
Столбцы, уникальные среди всех участвующих таблиц, технически можно писать без квалификатора. Но на практике единый стиль — всегда псевдоним.столбец — избавляет от ошибок при добавлении новой таблицы в запрос: имя, которое раньше было уникальным, может перестать им быть, и тогда SQLite завершит запрос ошибкой неоднозначного имени. Проще не делать исключений.
