1052: Kolumna " id " w liście pól jest niejednoznaczna

Mam 2 stoliki. tbl_names i tbl_section, które mają w sobie zarówno pole id. Jak wybrać pole id, bo zawsze dostaję ten błąd:

1052: Column 'id' in field list is ambiguous

Oto moje zapytanie:

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

Mogę po prostu wybrać wszystkie pola i uniknąć błędu. Ale to byłaby strata wydajności. Co mam zrobić?

Author: vog, 2011-07-10

8 answers

SQL obsługuje kwalifikowanie kolumny przez prefiks odniesienia z pełną nazwą tabeli:

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

...lub alias tabeli:

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

Alias tabeli jest zalecanym podejściem -- po co wpisywać więcej niż trzeba?

Dlaczego Te Zapytania Wyglądają Inaczej?

Po Drugie, moje odpowiedzi używają składni ANSI-92 JOIN (Twoja to ANSI-89). Podczas wykonywania tego samego, składnia ANSI-89 nie obsługuje złączeń zewnętrznych (PRAWY, LEWY, pełny). Składnia ANSI-89 powinna być uznana za przestarzałą, jest wielu NA SO, którzy nie zagłosują na składnię ANSI-89, aby to wzmocnić. Aby uzyskać więcej informacji, zobacz to pytanie .

 162
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

W twoim SELECT oświadczeniu musisz przedłożyć swój identyfikator tabelą, z której chcesz go wybrać.

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

Lub

SELECT tbl_section.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id
 17
Author: Taryn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-23 20:13:23

Można to zrobić podając w pełni kwalifikowaną nazwę, np.:

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

Co da ci id tbl_names

 6
Author: halfdan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-10 01:12:07

Najprostszym rozwiązaniem jest połączenie z USING zamiast ON. W ten sposób baza danych "wie", że obie kolumny id są rzeczywiście takie same i nie będzie się nad tym zastanawiać:

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

Jeśli id jest jedyną wspólną nazwą kolumny w tbl_names i tbl_section, możesz nawet użyć NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Zobacz też: https://dev.mysql.com/doc/refman/5.7/en/join.html

 4
Author: vog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-15 20:21:31

To, co prawdopodobnie naprawdę chcesz zrobić, to użyć operatora Unii w ten sposób:

(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

Oto dokumenty do tego https://dev.mysql.com/doc/refman/5.0/en/union.html

 3
Author: Bryan Legend,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-28 20:34:28

Już jest wiele odpowiedzi na twoje pytanie, możesz to zrobić również w ten sposób. Możesz nadać swojej tabeli nazwę aliasu i użyć jej w zapytaniu select w następujący sposób:

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;
 3
Author: M.J,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-25 06:28:54

Jeśli format id w obu tabelach jest różny, to chcesz do nich dołączyć, jako taki możesz użyć id z jednej głównej tabeli, powiedzmy, jeśli masz table_customes i table_orders, A id dla zamówień jest jak "101","102"..."110", wystarczy użyć jednego dla Klientów

select customers.id, name, amount, date from customers.orders;
 0
Author: Festole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-23 06:40:39
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
 -1
Author: nikunj,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-22 14:08:59