it-swarm.com.de

1052: Die Spalte 'id' in der Feldliste ist nicht eindeutig

Ich habe 2 Tische. tbl_names und tbl_section, in dem sich das Feld id befindet. Wie gehe ich vor, wenn ich das Feld id auswähle, da ich immer die folgende Fehlermeldung erhalte:

1052: Column 'id' in field list is ambiguous

Hier ist meine Frage:

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

Ich könnte einfach alle Felder auswählen und den Fehler vermeiden. Aber das wäre eine Verschwendung von Leistung. Was sollte ich tun?

79
Wern Ancheta

SQL unterstützt das Qualifizieren einer Spalte, indem der Referenz entweder der vollständige Tabellenname vorangestellt wird:

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

... oder ein Tabellenalias:

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

Der Tabellenalias ist der empfohlene Ansatz. Warum geben Sie mehr ein, als Sie müssen?

Warum sehen diese Abfragen anders aus?

Zweitens verwenden meine Antworten die ANSI-92-JOIN-Syntax (Ihre ist ANSI-89). Während sie dasselbe ausführen, unterstützt die ANSI-89-Syntax keine OUTER-Joins (RIGHT, LEFT, FULL). ANSI-89-Syntax sollte als veraltet betrachtet werden. Es gibt viele unter SO, die nicht für ANSI-89-Syntax stimmen, um dies zu verstärken. Für weitere Informationen finden Sie in dieser Frage .

136
OMG Ponies

In Ihrer SELECT -Anweisung müssen Sie Ihrer ID die Tabelle voranstellen, aus der Sie sie auswählen möchten.

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

OR

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

Sie würden dies tun, indem Sie einen vollständig qualifizierten Namen angeben, z.

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

Welches würde Ihnen die ID von tbl_names geben

6
halfdan

Es gibt bereits viele Antworten auf Ihre Frage. Sie können dies auch so tun. Sie können Ihrer Tabelle einen Aliasnamen geben und diesen in der Auswahlabfrage wie folgt verwenden:

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

Was Sie hier wahrscheinlich wirklich tun möchten, ist den Vereinigungsoperator wie folgt zu verwenden:

(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

Hier sind die Dokumente dafür https://dev.mysql.com/doc/refman/5.0/en/union.html

3
Bryan Legend

Die einfachste Lösung ist ein Join mit USING anstelle von ON. Auf diese Weise "weiß" die Datenbank, dass beide id -Spalten tatsächlich gleich sind, und wählt das nicht aus:

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

Wenn id der einzige gebräuchliche Spaltenname in tbl_names Und tbl_section Ist, können Sie sogar einen NATURAL JOIN Verwenden:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

Siehe auch: https://dev.mysql.com/doc/refman/5.7/en/join.html

2
vog

Wenn das Format der IDs in den beiden Tabellen unterschiedlich ist, möchten Sie sie verbinden. Als solches können Sie auswählen, ob Sie eine ID aus einer Haupttabelle verwenden möchten, z. B. wenn Sie table_customes Und table_orders Haben. , und die ID für Bestellungen ist wie "101", "102" ... "11", verwenden Sie einfach eine für Kunden

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