Здравствуйте, уважаемые подписчики и гости канала!
Очень коротко - ошибка про ambiguous означает, что база данных не знает из какой из таблиц брать поле. У вас в запросе есть JOIN с одной или более таблиц и вы выбираете * (звездочку) или поле без указания имени таблиц или ее alias (если он указан).
Начал снимать серию видео про SQL, так как эта тема пользуется большой популярностью на Дзене. Ниже разбор ошибки ambiguous column. Если что время ставьте на 5:00.
Подборка видео всех видео по PG - https://dzen.ru/suite/37b67ffa-176d-493a-b1a8-4762f79e3753
---
Минутка рекламы - я вижу, что эта статья пользуется очень большой популярностью и полезна многим. Уверен, что мой ТГ канал тоже будет вам полезен, подписывайтесь и получайте интересные заметки, заодно таким образом поможете мне с его развитием - Уйти в IT! в Телеграм
Например, есть таблицы foo (с полями id, name, bar_id) и bar (с полями id, name). Если сделать такой запрос:
SELECT id, name from foo LEFT JOIN bar ON bar.id = foo.bar_id
То вы получите ошибку про ambiguous, так как и id и name есть в обеих таблицах. То же самое применимо к секциям про GROUP BY, ORDER BY, HAVING и т.д.
Важное знание
Очень важно знать - когда делаешь join всегда пиши alias таблиц перед всеми полями. Если этого не сделать, то запрос даже если сразу не будет падать по ambiguous, может работать до тех пор, пока в одну из таблиц не добавят поле с таким же именем. Часто это всякие user_id, creation_time и пр. А если у вас не 100% покрытие тестами (зуб даю), и тестировщик не заметит, то в продакшене будет а-та-та!
То же самое другими словами
Простой пример.
У вас в актовом зале школы два или три класса и завучу надо позвать Васю (6А), Петю (7А) и Колю (10Б). Вот только Коли и Васи есть больше, чем в одном классе, но в одном классе есть только один человек с таким именем (это для упрощения, ведь в одной таблице не может быть двух полей с одинаковыми именами).
Значит завучу просто надо сказать Коля из 10Б и Вася из 6А и Петя из 7А подойдите, пожалуйста.
Петю, конечно, можно позвать и так, если завуч уверен, что Петя в школе всего один) Но может еще какой-то Петя туда пришел, а никто и не знает...
UNION ALL
Важно отметить, что на практике часто встречаю, что народ делает JOIN и получает ambiguous в случае, когда join и нужен-то не был, а надо было просто из двух разных таблиц получить одни и те же поля. Делают примерно такое:
SELECT Date, CampaignId, CampaignName
FROM tbl1
LEFT JOIN tbl2 ON tbl1.Date = tbl2.Date
А на самом деле хотят такое:
SELECT Date, CampaignId, CampaignName
FROM tbl1
UNION ALL
SELECT Date, CampaignId, CampaignName
FROM tbl2
Статей про базы данных на канале много, так что, подписывайтесь, чтобы не пропустить =) Есть и про Postgres и про BigQuery, но если в целом - то ansi sql standard штука базовая и много статей часто одинаково применимы к любым базам данных, включая sql.
---
А на этом всё, спасибо за внимание!
Подписывайтесь на канал, ставьте лайки, оставляйте комментарии - это помогает продвижению в Дзене.
Кроме этого:
Подписывайтесь в Telegram: https://t.me/lets_goto_it
#sql #postgres #database #dba #bigquery #начинающий программист