2009-06-29 13 views
23

sto ottenendo il seguente errore quando si tenta di eseguire questa query in SQL 2005:SQL 2005 - La colonna è stata specificata più volte

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'. 

Sono nuovo di sql. Grazie in anticipo per il vostro consiglio.

Eneo.

+2

Solo per curiosità, perché avete l'esterno "selezionare tb. *"? – NotMe

risposta

33

Il problema, come detto, è che si sta selezionando PEiD da due tabelle, la soluzione è quella di specificare quali PEiD vuoi, per esempio

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; 

A parte questo, come Chris Lively sottolinea abilmente in un commento il SELECT esterno è del tutto superfluo. Quanto segue è totalmente equivalente al primo.

 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 

o anche

 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 

ma per favore evitano il ricorso ad SELECT * quando possibile. Potrebbe funzionare mentre si stanno facendo interrogazioni interattive per risparmiare la digitazione, ma nel codice di produzione non usarlo mai.

4

Sembra che tu abbia la colonna PEiD in entrambe le tabelle: vDeriveAvailabilityFromPE e PE_PDP. L'istruzione SELECT tenta di selezionare entrambi e restituisce un errore sul nome della colonna duplicato.

+0

Ce l'ha in entrambi i tavoli, non sembra solo :) –

+0

Hai ragione, Vinko. :-) Su un sidenote: perché il mio secondo nome di tabella non viene visualizzato in corsivo? (mettilo in * *, ma visualizza come * PE_PDP *) L'anteprima è corretta. – MicSim

+0

Non so, problema per uservoice, penso. Ho provato alcuni dei soliti trucchi (aggiungendo spazi o riformattazione) ma non ha funzionato. –

1

Stai unendo tre tabelle e guardando tutte le colonne nell'output (*).

Sembra che le tabelle abbiano un nome di colonna comune PEID, al quale si dovrà fare l'alias come qualcos'altro.

Soluzione: non utilizzare * nella sottoquery, ma selezionare esplicitamente ogni colonna che si desidera vedere, aliasing di qualsiasi nome di colonna che appare più di una volta.

0

Invece di utilizzare * per identificare la raccolta di tutti i campi, riscrivere la query per denominare esplicitamente le colonne desiderate. In questo modo non ci sarà confusione.

0

basta dare nuovo nome alias per la colonna che si ripete, ha funzionato per me .....

+2

Ti preghiamo di considerare la modifica della tua risposta per fornire maggiori dettagli sul motivo per cui la tua soluzione lavori. Ciò aiuterà OP e chiunque abbia lo stesso problema in futuro – CallumDA

Problemi correlati