1052: Идентификатор столбца в списке полей неоднозначен

99

У меня 2 стола. tbl_namesи в tbl_sectionкотором есть оба idполя. Как мне выбрать idполе, потому что я всегда получаю эту ошибку:

1052: Column 'id' in field list is ambiguous

Вот мой запрос:

SELECT id, name, section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id

Я мог просто выбрать все поля и избежать ошибки. Но это было бы потерей производительности. Что я должен делать?

Верн Анчета
источник

Ответы:

156

SQL поддерживает определение столбца путем добавления к ссылке префикса полного имени таблицы:

SELECT tbl_names.id, tbl_section.id, name, section
  FROM tbl_names
  JOIN tbl_section ON tbl_section.id = tbl_names.id 

... или псевдоним таблицы:

SELECT n.id, s.id, n.name, s.section
  FROM tbl_names n
  JOIN tbl_section s ON s.id = n.id 

Псевдоним таблицы - рекомендуемый подход - зачем вводить больше, чем нужно?

Почему эти запросы выглядят иначе?

Во-вторых, мои ответы используют синтаксис ANSI-92 JOIN (ваш ANSI-89). Хотя они работают одинаково, синтаксис ANSI-89 не поддерживает ВНЕШНИЕ соединения (RIGHT, LEFT, FULL). Синтаксис ANSI-89 следует считать устаревшим, многие в SO не будут голосовать за синтаксис ANSI-89, чтобы усилить его. Для получения дополнительной информации см. Этот вопрос .

OMG Пони
источник
Сбивает с толку! Поскольку фактически из языка SQL ничего не удаляется, SQL-89 является правильным подмножеством SQL-92. Синтаксис OP является допустимым синтаксисом SQL-92 (и., Если я чего-то не упускаю, ваш действительный синтаксис SQL-89). Я считаю, INNER JOINчто он «обесценился» с момента появления SQL-92 NATURAL JOIN.
однажды, когда 02
17

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

SELECT tbl_names.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id

ИЛИ

SELECT tbl_section.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id
Тарин
источник
Это возвращает только одно из idполей; OP гласит: «Просто выберите все поля и избегайте ошибки». И я не голосую за синтаксис ANSI-89.
OMG Ponies
Согласен, но вопрос был в том, как выбрать поле id.
Тарин
6

Это можно сделать, указав полное имя, например:

SELECT tbl_names.id as id, name, section FROM tbl_names, tbl_section WHERE tbl_names.id = tbl_section.id

Что даст вам идентификатор tbl_names

Halfdan
источник
См. Мой комментарий к ответу bluefeet
OMG Ponies
Это не «полное имя», это переменная диапазона. Если вы опускаете явную переменную диапазона, SQL генерирует переменную, которая совпадает с именем таблицы. Чтобы лучше понять, что я имею в виду, измените ваше FROMпредложение ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- это то, что синтаксический анализатор делает для создания переменной диапазона.
однажды, когда 02
4

Самое простое решение - это соединение USINGвместо ON. Таким образом, база данных «знает», что оба idстолбца на самом деле одинаковы, и не будет придираться к этому:

SELECT id, name, section
  FROM tbl_names
  JOIN tbl_section USING (id)

Если idэто единственное общее имя столбца в tbl_namesи tbl_section, вы даже можете использовать NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

См. Также: https://dev.mysql.com/doc/refman/5.7/en/join.html

Vog
источник
3

Что вы, вероятно, действительно хотите здесь сделать, это использовать оператор объединения следующим образом:

(select ID from Logo where AccountID = 1 and Rendered = 'True')
  union
  (select ID from Design where AccountID = 1 and Rendered = 'True')
  order by ID limit 0, 51

Вот документы для этого https://dev.mysql.com/doc/refman/5.0/en/union.html

Брайан Ледженд
источник
3

На ваш вопрос уже есть много ответов, вы тоже можете это сделать. Вы можете дать своей таблице псевдоним и использовать его в запросе выбора следующим образом:

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;
MJ
источник
0

Если формат идентификаторов в двух таблицах различается, вы хотите присоединиться к ним, поэтому вы можете выбрать использование идентификатора из одной основной таблицы, скажем, если у вас есть table_customesи table_orders, а идентификатор для заказов похож на « 101 », " 102 " ... " 110 ", просто используйте один для клиентов

select customers.id, name, amount, date from customers.orders;
Festole
источник
-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
никундж
источник