Когда нужно писать имя таблицы в запросе?

Вот простой пример объединения таблиц persons и positions
Рабочий запрос
SELECT id_person, name, id_pos, title 
FROM persons
INNER JOIN positions ON id_pos = position_ref


Но также мы можем написать и такой запрос
SELECT id_person, name, id_pos, title 
FROM persons
INNER JOIN positions ON positions.id_pos = position_ref


Когда нужно писать имя таблицы в запросе и с чем это связано?

PS
Некоторые запросы join (LEFT OUTER JOIN ??) у меня не работали без имени таблицы.
  • Вопрос задан
  • 215 просмотров
Решения вопроса 1
@galaxy
Если в разных таблицах имеются имеются колонки с одинаковыми названиями.
Иногда SQL это терпит (например, можно написать SELECT * FROM table1 CROSS JOIN table2, даже если в таблицах есть такие колонки), но чаще нет. В предикате JOIN ON или в WHERE нужно знать, о колонке какой таблицы идет речь.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@Akina
Сетевой и системный админ, SQL-программист.
Каждый сам творец своего геморроя.

Настоятельная рекомендация. Если источником записей запроса (всего, целиком) является только одна таблица - имена полей можно не указывать. Во всех остальных случаях - указывайте алиас таблицы для абсолютно каждого поля (включая имена обобщённых полей в USING и при NATURAL JOIN), кроме имён полей выходного набора, используемых в пост-группировочных выражениях. Это позволит гарантировать отсутствие неоднозначностей.

Под понятием "таблица" следует понимать строго один экземпляр исходного набора данных. Иными словами, запрос, в котором используется две копии одной таблицы, либо используется дополнительная синтетическая таблица констант, запросом с источником данных из одной таблицы не является.

---

В некоторых диалектах указание алиаса может быть обязательно и по причине интерференции имён из разных пространств.

Например, в хранимых объектах MySQL при совпадении имени поля таблицы с именем локальной переменной обращение без указания алиаса - это всегда обращение к переменной. Поэтому для MySQL правило ещё строже - алиас указывай всегда.

И даже такая строгость порой недостаточна. Пример. Обратите внимание на сортировку - в ней id интерпретируется как имя переменной, а не имя поля выходного набора, и потому результат "странный". Кстати, это тот случай, когда вообще ничто не поможет, кроме использования выражения выходного поля вместо его имени.
Ответ написан
Комментировать
logpol32
@logpol32 Автор вопроса
galaxy, вот ещё пример
(вспомнил где не работало)

У каждой таблицы есть колонка с именем id. Остальные имена колонок разные.
Это работает
SELECT ProductCode, Name FROM table_one 
LEFT OUTER JOIN table_two 
ON  table_two.id = table_one.id_client;


Это нет
SELECT ProductCode, Name FROM table_one 
LEFT OUTER JOIN table_two 
ON  id = table_one.id_client;

[Err] 1052 - Column 'id' in on clause is ambiguous

Достаточно просто совпадения имен любых колонок в структуре таблицы ()?
То есть смотрите - в ON сравнивается id и id_client. Имена разные.
Понятно что и с чем связывается.
И даже если ON id = id ведь понятно, что нужно сравнить id из первой таблицы со id из второй.
У нас 2 таблицы. И у каждой id. Больше не с чем сравнивать. Два одинаковых поля в таблице быть не может.
Ответ написан
@alexalexes
Всегда обзывайте каждую таблицу в запросе кратким именем, и это краткое имя используйте в именовании колонок, тогда ни при каких условиях проблем с конфликтом имен не возникнет.
SELECT t1.ProductCode, t2.Name
FROM table_one as t1 -- t1 - краткий псевдоним таблицы table_one в пределах select-а
LEFT OUTER JOIN table_two as t2 -- t2 - краткий псевдоним таблицы table_two в пределах select-а
ON  t2.id = t1.id_client;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы