1052: la colonna "id" nell'elenco dei campi è ambigua


94

Ho 2 tavoli. tbl_namese tbl_sectionche ha entrambi il idcampo in loro. Come faccio a selezionare il idcampo, perché ottengo sempre questo errore:

1052: Column 'id' in field list is ambiguous

Ecco la mia domanda:

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

Potrei semplicemente selezionare tutti i campi ed evitare l'errore. Ma sarebbe uno spreco di prestazioni. Cosa dovrei fare?

Risposte:


152

SQL supporta la qualificazione di una colonna anteponendo al riferimento il nome completo della tabella:

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

... o un alias di tabella:

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

L'alias di tabella è l'approccio consigliato: perché digitare più del necessario?

Perché queste query hanno un aspetto diverso?

In secondo luogo, le mie risposte utilizzano la sintassi ANSI-92 JOIN (la tua è ANSI-89). Sebbene eseguano lo stesso, la sintassi ANSI-89 non supporta i join ESTERNI (DESTRA, SINISTRA, COMPLETA). La sintassi ANSI-89 dovrebbe essere considerata deprecata, ce ne sono molti in SO che non voteranno per la sintassi ANSI-89 per rafforzarla. Per ulteriori informazioni, vedere questa domanda .


Confondere! Poiché nulla viene effettivamente rimosso dal linguaggio SQL, SQL-89 è un sottoinsieme appropriato di SQL-92. La sintassi dell'OP è una sintassi SQL-92 valida (e. A meno che non mi manchi qualcosa, la tua è una sintassi SQL-89 valida). Considero INNER JOINessere "deprezzato" dall'introduzione di SQL-92 NATURAL JOIN.
giorno del

16

Nella tua SELECTdichiarazione devi anteporre il tuo ID alla tabella da cui vuoi sceglierlo.

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

O

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

Ciò restituisce solo uno dei idcampi; l'OP afferma "seleziona tutti i campi ed evita l'errore". E non voto per la sintassi ANSI-89.
OMG Ponies

D'accordo, ma la domanda era come selezionare il campo id.
Taryn

6

Lo faresti fornendo un nome completo, ad esempio:

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

Che ti darebbe l'id di tbl_names


Vedi il mio commento alla risposta di bluefeet
OMG Ponies

Non è un "nome completo", è una variabile di intervallo. Quando si omette una variabile di intervallo esplicito, SQL ne genera una uguale al nome della tabella. Per vedere meglio cosa intendo, cambia la tua FROMclausola ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...: questo è ciò che il parser sta facendo per generare una variabile di intervallo.
giorno del

4

La soluzione più semplice è unire con USINGinvece di ON. In questo modo, il database "sa" che entrambe le idcolonne sono effettivamente uguali e non ne farà il pelo nell'occhio:

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

Se idè l'unico nome di colonna comune in tbl_namese tbl_section, puoi persino usare NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Vedi anche: https://dev.mysql.com/doc/refman/5.7/en/join.html


3

Quello che probabilmente vuoi davvero fare qui è usare l'operatore union in questo modo:

(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

Ecco la documentazione per questo https://dev.mysql.com/doc/refman/5.0/en/union.html


3

Ci sono già molte risposte alla tua domanda, puoi farlo anche in questo modo. Puoi dare alla tua tabella un nome alias e usarlo nella query di selezione in questo modo:

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;

0

Se il formato degli ID nelle due tabelle varia, allora vuoi unirti a loro, in quanto tale puoi scegliere di utilizzare un ID da una tabella principale, ad esempio se hai table_customese table_orders, e l'ID per gli ordini è come " 101 ", " 102 " ... " 110 ", usane uno per i clienti

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.