Отладка запросов и итоговый проект

Отладка SQL: синтаксические, логические ошибки и ошибки с NULL

Содержание курса

Ошибки столбцов при JOIN: неоднозначное имя и несуществующий столбец

Когда запрос соединяет несколько таблиц, СУБД сталкивается с двумя разными проблемами именования столбцов.

Несуществующий столбец (no such column в SQLite, column does not exist в PostgreSQL) означает, что среди доступных источников такого имени нет. Причиной бывает опечатка или старое имя после изменения схемы. Сначала проверьте схему и точное написание. SQLite разрешает некоторые обращения к SELECT-псевдонимам в WHERE как собственное расширение, поэтому это не надёжный пример ошибки отсутствующего столбца и не переносимое правило SQL.

Неоднозначный столбец (ambiguous column name) существует сразу в нескольких соединённых таблицах. В учебной схеме order_id есть и в orders, и в order_items:

-- Сломанный запрос
SELECT order_id, oi.quantity
FROM orders AS o
JOIN order_items AS oi ON o.order_id = oi.order_id;

SQLite не знает, нужен o.order_id или oi.order_id. Исправление — квалифицировать имя:

SELECT o.order_id, oi.quantity
FROM orders AS o
JOIN order_items AS oi ON o.order_id = oi.order_id;

Префикс нужен везде, где имя неоднозначно: в SELECT, WHERE, ON, GROUP BY или ORDER BY. Единый стиль псевдоним.столбец делает длинные запросы устойчивее: после добавления новой таблицы ранее уникальное имя может стать неоднозначным.

Сообщения требуют разных действий. no such column говорит: «такого имени среди источников нет». ambiguous column name говорит: «имя найдено в нескольких источниках, укажите нужный».