1052: Стовпець "id" у списку полів неоднозначний


94

У мене є 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

Я міг просто вибрати всі поля та уникнути помилки. Але це було б марним результатом. Що я повинен зробити?

Відповіді:


152

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 не підтримує ЗОВНІШНІ приєднання (ВПРАВО, ВЛІВО, ПОВНО). Синтаксис ANSI-89 слід вважати застарілим, на СО багато таких, хто не буде голосувати за синтаксис ANSI-89 для його посилення. Для отримання додаткової інформації див. Це питання .


Заплутано! Оскільки з мови SQL насправді нічого не видаляється, SQL-89 є належним підмножиною SQL-92. Синтаксис OP є дійсним синтаксисом SQL-92 (і. Якщо я чогось не пропустив, ваш дійсний синтаксис SQL-89). Я вважаю, INNER JOINщо "знецінений" з моменту введення SQL-92 NATURAL JOIN.
onedaywhen

16

У своїй 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

Погодився, але питання полягало в тому, як вибрати поле ідентифікатора.
Тарин

6

Ви могли б це зробити, вказавши повністю кваліфіковане ім’я, наприклад:

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

Що дасть вам ідентифікатор tbl_names


Дивіться мій коментар до відповіді bluefeet
OMG

Це не `` повністю кваліфіковане ім'я '', це змінна діапазону. Коли ви опускаєте явну змінну діапазону, SQL генерує таку, яка збігається з назвою таблиці. Щоб краще зрозуміти, що я маю на увазі, змініть свій FROMпункт ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- це те, що робить парсер для створення змінної діапазону.
день, коли

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


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;

0

Якщо формат ідентифікаторів у двох таблицях різниться, тоді ви хочете приєднатись до них, тому ви можете вибрати використовувати ідентифікатор з однієї основної таблиці, скажімо, якщо у вас є table_customesі table_orders, а ідентифікатор для замовлень - " 101 ", " 102 " ... " 110 ", просто використовуйте одну для клієнтів

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

-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.