2009-06-29 9 views
23

Ich erhalte die folgende Fehlermeldung beim Versuch, diese Abfrage in SQL 2005 ausführen:SQL 2005 - Die Spalte angegeben wurde mehrmals

SELECT tb.* 
    FROM (
     SELECT * 
     FROM vCodesWithPEs INNER JOIN vDeriveAvailabilityFromPE 
     ON vCodesWithPEs.PROD_PERM = vDeriveAvailabilityFromPE.PEID 
     INNER JOIN PE_PDP ON vCodesWithPEs.PROD_PERM = PE_PDP.PEID 
    ) AS tb; 

Error: The column 'PEID' was specified multiple times for 'tb'. 

Ich bin neu in SQL. Vielen Dank im Voraus für Ihre Beratung.

Eneo.

+2

Nur aus Neugier, warum haben Sie die äußere „tb wählen. *“? – NotMe

Antwort

33

Das Problem, wie bereits erwähnt, ist, dass Sie PEiD aus zwei Tabellen auswählen, die Lösung angeben, welche PEiD wollen Sie zum Beispiel

SELECT tb.* 
    FROM (
     SELECT tb1.PEID,tb2.col1,tb2.col2,tb3.col3 --, and so on 
     FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2 
     ON tb1.PROD_PERM = tb2.PEID 
     INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID 
    ) AS tb; 

Abgesehen davon, wie Chris Lively weist darauf hin, geschickt in Ein Kommentar der äußeren SELECT ist völlig überflüssig. Das Folgende ist völlig gleichwertig mit dem ersten.

 SELECT tb1.PEID,tb2.col1,tb2.col2,tb3.col3 --, and so on 
     FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2 
     ON tb1.PROD_PERM = tb2.PEID 
     INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID 

oder sogar

 SELECT * 
     FROM vCodesWithPEs as tb1 INNER JOIN vDeriveAvailabilityFromPE as tb2 
     ON tb1.PROD_PERM = tb2.PEID 
     INNER JOIN PE_PDP tb3 ON tb1.PROD_PERM = tb3.PEID 

aber bitte vermeiden, mit SELECT *, wann immer möglich. Es kann funktionieren, während Sie interaktive Abfragen ausführen, um die Eingabe zu speichern, aber im Produktionscode niemals verwenden.

4

Sieht aus wie Sie die Spalte PEiD in beiden Tabellen haben: vDeriveAvailabilityFromPE und PE_PDP. Die Anweisung SELECT versucht beide auszuwählen und gibt einen Fehler bezüglich des doppelten Spaltennamens aus.

+0

Er hat es in beiden Tabellen, sieht nicht nur aus :) –

+0

Du hast Recht, Vinko. :-) Auf einer Nebenbemerkung: Warum wird mein zweiter Tabellenname nicht in Kursivschrift angezeigt? (setzen Sie es in * *, aber zeigt als * PE_PDP *) Vorschau ist korrekt. – MicSim

+0

Ich weiß nicht, Problem für uservoice denke ich. Ich habe versucht, einige der üblichen Tricks (Leerzeichen hinzufügen oder Neuformatierung), aber es hat nicht funktioniert –

1

Sie verbinden drei Tabellen und betrachten alle Spalten in der Ausgabe (*).

Es sieht so aus, als ob die Tabellen einen gemeinsamen Spaltennamen PEID haben, den Sie als Alias ​​verwenden müssen.

Lösung: Verwenden Sie nicht * in der Unterabfrage, sondern wählen Sie jede Spalte, die Sie sehen möchten, explizit aus und aliasieren Sie einen beliebigen Spaltennamen, der mehr als einmal angezeigt wird.

0

Anstatt * zum Identifizieren aller Felder zu verwenden, schreiben Sie Ihre Abfrage neu, um die gewünschten Spalten explizit zu benennen. Auf diese Weise wird es keine Verwirrung geben.

0

nur geben neuen Alias-Namen für die Spalte, die wiederholt, ist es für mich gearbeitet .....

+2

Bitte beachten Sie, Ihre Antwort zu bearbeiten, um mehr Details, warum Ihre Lösung zu geben funktioniert. Dies wird OP und jedem, der das gleiche Problem in der Zukunft hat, helfen – CallumDA

Verwandte Themen