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

94

Ich habe 2 Tische. tbl_namesund tbl_sectiondas hat beide das idFeld in ihnen. Wie wähle ich das idFeld aus, da immer folgende Fehlermeldung angezeigt wird:

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 Leistungsverschwendung. Was soll ich machen?

Wern Ancheta
quelle

Antworten:

150

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 mehr eingeben als nötig?

Warum sehen diese Abfragen anders aus?

Zweitens verwenden meine Antworten die ANSI-92 JOIN-Syntax (Ihre ist ANSI-89). Während sie dieselbe Leistung erbringen, unterstützt die ANSI-89-Syntax keine OUTER-Joins (RECHTS, LINKS, VOLL). Die ANSI-89-Syntax sollte als veraltet angesehen werden. Es gibt viele auf SO, die nicht für die ANSI-89-Syntax stimmen, um dies zu verstärken. Für weitere Informationen finden Sie in dieser Frage .

OMG Ponys
quelle
Verwirrend! Da tatsächlich nichts aus der SQL-Sprache entfernt wird, ist SQL-89 eine geeignete Teilmenge von SQL-92. Die Syntax des OP ist eine gültige SQL-92-Syntax (und wenn mir etwas fehlt, ist Ihre eine gültige SQL-89-Syntax). Ich halte INNER JOINes seit Einführung von SQL-92 für "abgeschrieben" NATURAL JOIN.
Tag, wenn
16

In Ihrer SELECTErklärung 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

ODER

SELECT tbl_section.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id
Taryn
quelle
Dies gibt nur eines der idFelder zurück. Das OP sagt: "Wählen Sie einfach alle Felder aus und vermeiden Sie den Fehler." Und ich stimme nicht für die ANSI-89-Syntax.
OMG Ponys
Einverstanden, aber die Frage war, wie das ID-Feld ausgewählt werden soll.
Taryn
6

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

Halfdan
quelle
Siehe meinen Kommentar zur Antwort von bluefeet
OMG Ponies
Es ist kein 'vollständig qualifizierter Name', sondern eine Bereichsvariable. Wenn Sie eine explizite Bereichsvariable weglassen, generiert SQL eine Variable, die dem Tabellennamen entspricht. Um besser zu verstehen, was ich meine, ändern Sie Ihre FROMKlausel ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- genau das tut der Parser, um eine Bereichsvariable zu generieren.
Tag, wenn
4

Die einfachste Lösung ist ein Join mit USINGstatt ON. Auf diese Weise "weiß" die Datenbank, dass beide idSpalten tatsächlich gleich sind, und wählt dies nicht aus:

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

Wenn idder einzige gebräuchliche Spaltenname in tbl_namesund ist tbl_section, können Sie sogar Folgendes verwenden NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

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

vog
quelle
3

Was Sie hier wahrscheinlich wirklich tun möchten, ist, den Gewerkschaftsoperator 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 dazu https://dev.mysql.com/doc/refman/5.0/en/union.html

Bryan Legend
quelle
3

Es gibt bereits viele Antworten auf Ihre Frage. Sie können es auch so machen. 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;
MJ
quelle
0

Wenn das Format der IDs in den beiden Tabellen unterschiedlich ist, möchten Sie sie verbinden. Daher können Sie auswählen, ob eine ID aus einer Haupttabelle verwendet werden soll. Sagen Sie, wenn Sie table_customesund haben table_orders, und die ID für Bestellungen lautet " 101 ". " 102 " ... " 110 ", verwenden Sie einfach eine für Kunden

select customers.id, name, amount, date from customers.orders;
Festole
quelle
-1
SELECT tbl_names.id, tbl_names.name, tbl_names.section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id
nikunj
quelle