2012-05-03 9 views
5

Ho notato che quando eseguivo una query con più join, la mia query non funzionava, a meno che non avessi assegnato a uno dei nomi di tabella un alias.Quando è necessario assegnare a un nome tabella un alias in SQL?

Ecco un semplice esempio per spiegare il punto:

Questo non lavoro:

SELECT subject 
from items 
join purchases on items.folder_id=purchases.item_id 
join purchases on items.date=purchases.purchase_date 
group by folder_id 

Questo fa:

SELECT subject 
from items 
join purchases on items.folder_id=purchases.item_id 
join purchases as p on items.date=p.purchase_date 
group by folder_id 

qualcuno può spiegare questo?

risposta

5

Si sta utilizzando la stessa tabella Acquisti due volte nella query. Hai bisogno di differenziarli dando un nome diverso.

è necessario dare un alias:

  • When the same table name is referenced multiple times

immaginare due persone che hanno esattamente lo stesso John Doe. Se chiami John, entrambi risponderanno alla tua chiamata. Non puoi dare lo stesso nome a due persone e assumere che sapranno chi stai chiamando. Allo stesso modo, quando si assegna lo stesso insieme di risultati chiamato esattamente lo stesso, SQL non può identificare da quale prendere valori. È necessario fornire nomi diversi per distinguere i set di risultati in modo che il motore SQL non venga confuso.

Script 1: t1 e t2 sono i nomi alias qui

SELECT  t1.col2 
FROM  table1 t1 
INNER JOIN table1 t2 
ON   t1.col1 = t2.col1 
  • When there is a derived table/sub query output

Se una persona non ha un nome, si chiamali e dato che non puoi chiamarli, non risponderanno a te u. Allo stesso modo, quando si genera un output di una tabella derivata o un output di query secondaria, è qualcosa di sconosciuto al motore SQL e non sarà come chiamare. Pertanto, è necessario assegnare un nome all'output derivato in modo che il motore SQL possa gestire adeguatamente l'output derivato.

Script 2: t1 è il nome dell'alias qui.

SELECT col1 
FROM 
(
    SELECT col1 
    FROM table1 
) t1 
4

L'unica volta che è OBBLIGATORIO fornire un alias è quando si fa riferimento alla tabella più volte e quando si hanno output derivati ​​(sottoquery che fungono da tabelle) (grazie per averlo rilevato Siva). In questo modo è possibile eliminare ambiguità tra i riferimenti di tabella da utilizzare nel resto della query.

di elaborare ulteriormente, nel tuo esempio:

SELECT subject 
from items 
join purchases on items.folder_id=purchases.item_id 
join purchases on items.date=purchases.purchase_date 
group by folder_id 

La mia ipotesi è che si sente che ogni join e la sua corrispondente on utilizzerà il tabella di corrispondenza, ma è possibile utilizzare qualsiasi riferimento tabella che si desidera. Quindi, ciò che accade è che quando si dice on items.date=purchases.purchase_date, il motore SQL viene confuso se si intende la prima tabella acquisti o la seconda.

Aggiungendo l'alias, ora si eliminano le ambiguità essendo più esplicito. Il motore SQL ora può dire con certezza al 100% quale versione degli acquisti si desidera utilizzare. Se deve indovinare tra due scelte uguali, allora genera sempre un errore chiedendo di essere più esplicito.

+0

@Siva corretto, grazie –

1

È necessario assegnare loro un nome quando la stessa tabella viene utilizzata due volte in una query. Nel tuo caso, la query non saprebbe quale tabella scegliere da purchase.purchase_date da.

0

Non è possibile utilizzare lo stesso nome di tabella nella stessa query A MENO CHE sia alias come qualcos'altro per impedire una condizione di join ambiguo. Ecco perché non è permesso. Dovrei notare, è anche meglio usare sempre qualificare table.field o alias.field in modo che altri sviluppatori dietro di te non debbano indovinare quali colonne provengono da quali tabelle.

Quando si scrive una query, si sa con cosa si sta lavorando, ma per quanto riguarda la persona dietro di te in fase di sviluppo. Se qualcuno non è abituato a quali colonne provengono da quale tabella, può essere ambiguo da seguire, specialmente qui a S/O. Con la qualifica sempre utilizzando il riferimento e il campo della tabella, o il riferimento alias e il campo, è molto più facile da seguire.

select 
     SomeField, 
     AnotherField 
    from 
     OneOfMyTables 
     Join SecondTable 
      on SomeID = SecondID 

Confronti che, per

select 
     T1.SomeField, 
     T2.AnotherField 
    from 
     OneOfMyTables T1 
     JOIN SecondTable T2 
      on T1.SomeID = T2.SecondID 

In questi due scenari, che si preferisce leggere ... Avviso, Ho semplificato la query utilizzando alias più brevi "T1" e "T2", ma potrebbero essere qualsiasi cosa, anche un acronimo o un alias abbreviato dei nomi delle tabelle ... "oomt" (uno dei miei tavoli) e "st" (secondo tavolo). Oppure, come qualcosa di super lungo come in altri post ...

Select * from ContractPurchaseOffice_AgencyLookupTable 

vs 

Select * from ContractPurchaseOffice_AgencyLookupTable AgencyLkup 

Se si desidera mantenere i join di qualifica o le colonne di campi, quale preferiresti guardare.

Spero che questo chiarisca la tua domanda.

+0

hi DRapp, grazie, sono un po 'confuso sulla frase "... è anche meglio usare sempre qualificare table.field ...". Puoi ampliarlo? –

1

In questo caso è semplicemente che hai specificato gli acquisti due volte e il motore SQL deve essere in grado di fare riferimento a ciascun set di dati nel join in un modo univoco, quindi è necessario l'alias.

Come punto a parte, hai davvero bisogno di unirti agli acquisti due volte? Non funziona:

SELECT 
    subject 
from 
    items 
    join purchases 
     on items.folder_id=purchases.item_id 
     and items.date=purchases.purchase_date 
group by folder_id 
+0

grazie Dave, oh che bello non avevo pensato a quella soluzione! –

1

Gli alias sono necessari per disambiguare la tabella da cui ottenere una colonna.

Quindi, se il nome della colonna è univoco nell'elenco di tutte le colonne possibili disponibili nelle tabelle nell'elenco, è possibile utilizzare direttamente il nome di coulmn.

Se il nome della colonna viene ripetuto in molte delle tabelle disponibili nell'elenco da, il server DB non ha modo di indovinare quale è la tabella giusta per ottenere la colonna.

Nella tua query di esempio tutti i nomi di colonne sono duplicati perché stai ricevendo "due istanze" della stessa tabella (acquisti), quindi il server deve sapere da quale istanza prendere la colonna. Quindi è necessario specificarlo.

Infatti, ti consiglio di utilizzare sempre un alias, a meno che non ci sia un solo tavolo. In questo modo eviterai molti problemi e renderai la query molto più chiara per capire.

Problemi correlati