1052: Kolumna „id” na liście pól jest niejednoznaczna


99

Mam 2 stoły. tbl_namesi tbl_sectionktóry ma w sobie zarówno idpole. Jak mam wybrać idpole, ponieważ zawsze otrzymuję 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łem po prostu zaznaczyć wszystkie pola i uniknąć błędu. Ale to byłaby strata wydajności. Co powinienem zrobić?

Odpowiedzi:


156

SQL obsługuje kwalifikowanie kolumny, poprzedzając odwołanie 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ż musisz?

Dlaczego te zapytania wyglądają inaczej?

Po drugie, moje odpowiedzi używają składni ANSI-92 JOIN (twoja to ANSI-89). Chociaż wykonują to samo, składnia ANSI-89 nie obsługuje złączeń OUTER (RIGHT, LEFT, FULL). Składnię ANSI-89 należy uznać za przestarzałą, jest wielu na SO, którzy nie będą głosować za składnią ANSI-89, aby to wzmocnić. Aby uzyskać więcej informacji, zobacz to pytanie .


Mylące! Ponieważ w rzeczywistości nic nie jest usuwane z języka SQL, SQL-89 jest właściwym podzbiorem SQL-92. Składnia OP jest poprawna składnią SQL-92 (i jeśli czegoś nie brakuje, twoja jest poprawna składnia SQL-89). Uważam, że jestem INNER JOIN„zdeprecjonowany” od czasu wprowadzenia SQL-92 NATURAL JOIN.
onedaywhen

17

W swoim SELECToświadczeniu musisz poprzedzić 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

Zwraca tylko jedno z idpól; OP stwierdza „po prostu zaznacz wszystkie pola i uniknij błędu”. I nie głosuję za składnią ANSI-89.
Kucyki OMG,

Zgoda, ale pytanie brzmiało, jak wybrać pole identyfikatora.
Taryn

6

Zrobiłbyś to, 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

Który dałby ci identyfikator tbl_names


Zobacz mój komentarz do odpowiedzi bluefeeta
Kucyki OMG,

To nie jest „w pełni kwalifikowana nazwa”, jest to zmienna zakresu. Jeśli pominiesz jawną zmienną zakresu, SQL generuje taką, która jest taka sama jak nazwa tabeli. Aby lepiej zobaczyć, co mam na myśli, zmień swoją FROMklauzulę ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- to właśnie robi parser, aby wygenerować zmienną zakresu.
onedaywhen

4

Najprostszym rozwiązaniem jest łączenie z USINGzamiast ON. W ten sposób baza danych „wie”, że obie idkolumny są w rzeczywistości takie same i nie będzie tego szukać:

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

Jeśli idjest jedyną popularną nazwą kolumny w tbl_namesi 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


3

To, co prawdopodobnie naprawdę chcesz tutaj zrobić, to użyć operatora związku w następujący 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 dokumentacja https://dev.mysql.com/doc/refman/5.0/en/union.html


3

Odpowiedzi na Twoje pytanie jest już wiele, możesz to również zrobić w ten sposób. Możesz nadać swojej tabeli nazwę aliasu i użyć jej w zapytaniu wybierającym 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;

0

Jeśli format identyfikatorów w obu tabelach jest różny, chcesz do nich dołączyć, ponieważ możesz wybrać, czy chcesz użyć identyfikatora z jednej głównej tabeli, powiedz, czy masz table_customesi table_orders, a identyfikator dla zamówień to „ 101 ”, „ 102 ” ... „ 110 ”, po prostu użyj jednego dla klientów

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.