Syntaxi USING nepoužívám od
- většina mých spojení pro to není vhodná (nejedná se o stejný název pole, který je porovnáván, a/nebo více shod ve spojení) a
- není hned zřejmé, co to znamená v případě více než dvou tabulek
tj. za předpokladu 3 tabulek se sloupci 'id' a 'id_2' ano
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)
stát
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)
nebo
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)
nebo zase něco jiného?
Zjistit to pro konkrétní verzi databáze je poměrně triviální cvičení, ale nemám velkou jistotu, že je konzistentní ve všech databázích, a nejsem jediný, kdo musí udržovat svůj kód (takže ostatní lidé si také budou muset být vědomi toho, co je ekvivalentní).
Zjevný rozdíl mezi WHERE a ON je, pokud je spojení vnější:
Za předpokladu, že T1 s jedním polem ID, jeden řádek obsahující hodnotu 1 a T2 s polem ID a HODNOTA (jeden řádek, ID=1, VALUE=6), dostaneme:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42
nedává žádné řádky, protože WHERE se musí shodovat, zatímco
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)
dá jeden řádek s hodnotami
1, NULL, NULL
protože ON je vyžadováno pouze pro shodu spojení, které je volitelné, protože je vnější.