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.
per le risposte che dicono "per evitare ambiguità precedenti", possiamo prega di avere un esempio? – Oddthinking