1052: столбец id в списке полей неоднозначен - PullRequest
77 голосов
/ 10 июля 2011

У меня есть 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

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

Ответы [ 8 ]

133 голосов
/ 10 июля 2011

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 не поддерживает соединения OUTER (RIGHT, LEFT, FULL). Синтаксис ANSI-89 следует считать устаревшим, на SO есть много тех, кто не проголосует за синтаксис ANSI-89, чтобы это подтвердить. Для дополнительной информации см. Этот вопрос .

15 голосов
/ 10 июля 2011

В своем заявлении 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
6 голосов
/ 10 июля 2011

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

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

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

3 голосов
/ 25 мая 2016

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

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;
3 голосов
/ 28 мая 2015

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

(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

2 голосов
/ 15 июня 2018

Самое простое решение - это соединение с 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

0 голосов
/ 22 мая 2017
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
0 голосов
/ 23 марта 2014

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

select customers.id, name, amount, date from customers.orders;
...