Mam 2 stoły. tbl_names
i tbl_section
który ma w sobie zarówno id
pole. Jak mam wybrać id
pole, 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ć?
INNER JOIN
„zdeprecjonowany” od czasu wprowadzenia SQL-92NATURAL JOIN
.W swoim
SELECT
oś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
źródło
id
pól; OP stwierdza „po prostu zaznacz wszystkie pola i uniknij błędu”. I nie głosuję za składnią ANSI-89.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
źródło
FROM
klauzulę...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...
- to właśnie robi parser, aby wygenerować zmienną zakresu.Najprostszym rozwiązaniem jest łączenie z
USING
zamiastON
. W ten sposób baza danych „wie”, że obieid
kolumny 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
id
jest jedyną popularną nazwą kolumny wtbl_names
itbl_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
źródło
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
źródło
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;
źródło
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_customes
itable_orders
, a identyfikator dla zamówień to „ 101 ”, „ 102 ” ... „ 110 ”, po prostu użyj jednego dla klientówselect customers.id, name, amount, date from customers.orders;
źródło
SELECT tbl_names.id, tbl_names.name, tbl_names.section FROM tbl_names, tbl_section WHERE tbl_names.id = tbl_section.id
źródło