2010-04-24 16 views
5

Per SQL, quando è iniziato ad essere desiderabile per usare sempre le parole "inner join" invece di unirsi implicitamente da:Per SQL, quando è stato preferibile utilizzare sempre le parole "Inner Join" invece di unirsi implicitamente?

select * from t1, t2 where t1.ID = t2.ID; 

? È solo per lo stile o per distinguere tra outer join o ci sono altri motivi?

+0

per le risposte che dicono "per evitare ambiguità precedenti", possiamo prega di avere un esempio? – Oddthinking

risposta

3

La sintassi INNER e OUTER JOIN è stata formalizzata nella specifica SQL-92. In molti prodotti di database come MySQL e SQL Server, è possibile omettere la parola "INNER" dai join interni e utilizzare semplicemente "JOIN". Allo stesso modo, molti prodotti di database consentono di omettere la parola "ESTERNO" e di utilizzare semplicemente "LEFT JOIN" o "RIGHT JOIN" per i join esterni. La vecchia sintassi di join esterno di *= o =* creava ambiguità in molte circostanze. Molti prodotti hanno o presto smetteranno di supportare la vecchia sintassi del join esterno.

Prima della specifica SQL-92, i fornitori utilizzavano ciascuno la propria sintassi indicando un join esterno. Ad esempio, *= non era universale (mi sembra di ricordare qualcuno che utilizza ?=). Inoltre, non hanno implementato l'unione esterna in modo universale. Prendiamo il seguente esempio:

Table1 
Col1 Col2 
1  Alice 
2  Bob 

Table2 
Col1 Col2 
1   1 
2   2 
3   3 
4   4 

Select 
From Table1, Table2 
Where Table2.Col1 *= Table1.Col1 

La query sopra sarebbe generalmente cedere:

1 1 1  Alice 
2 2 2  Bob 
3 3 Null Null 
4 4 Null Null 

Ora provate:

Select 
From Table1, Table2 
Where Table2.Col1 *= Table1.Col1 
    And Table2.Name = 'Alice' 

Su alcuni prodotti di database, si otterrebbe:

1 1 1  Alice 

Su altri vorresti ottiene:

1 1 1  Alice 
2 2 Null Null 
3 3 Null Null 
4 4 Null Null 

In breve, è ambigua se il filtraggio sulla tavola conservanti deve essere applicato prima o dopo il join.

+0

Mi piace lasciare fuori l'INTERNO e l'ESTERNO; troppa roba. In tutti i miei anni di programmazione con '* =' e '' = * (e c'erano pochi) Penso di aver avuto di rielaborare una o due domande a causa di ambiguità. Anche così, preferisco la nuova sintassi. –

+0

Yah. E Oracle utilizza l'abominevole omega-join (+) sintassi: seleziona un, b, c da q, r dove qx = ry (+) dovrebbe essere seleziona un, b, c da q LEFT JOIN R ON qx = ry –

2

È diventato preferibile quando è stata aggiunta la nuova sintassi per gestire le incoerenze con le implementazioni di outer join.

Da combinando (esterno e particolare join delle due direzioni) esterno ed interno si unisce con la vecchia sintassi è in molti casi ambiguo, nuova sintassi doveva essere creato e realizzato per consentire al programmatore di essere al 100% chiaro circa l'ordinamento e raggruppamento delle clausole di join.

Tuttavia, è ancora perfettamente legale scrivere i giunti interni vecchio stile da soli, ma le giunzioni esterne vecchio stile stanno andando via in tutte le forme e buona liberazione.

0

E 'diventato desiderabile quando è diventato possibile ...

Il join parola chiave descrive meglio l'intenzione che il "classico" join. Inoltre, quando si hanno molti join in una query, la tabella da unire e le condizioni da usare appaiono una accanto all'altra invece di avere tutte le tabelle in un posto e tutte le condizioni in un altro.

0

Credo che sia lo standard ANSI. Dovrebbe restituire un errore quando viene omessa la parola chiave ON e (IMO) è uno stile più dichiarativo.

0

ANSI-92 standard di hmmm che è un duro Vado su un arto e indovinate 1992

Problemi correlati