Ik gebruik de USING-syntaxis niet, omdat
- de meeste van mijn joins zijn er niet geschikt voor (niet dezelfde veldnaam die wordt gevonden en/of meerdere overeenkomsten in de join) en
- het is niet meteen duidelijk wat het betekent in het geval met meer dan twee tabellen
dwz uitgaande van 3 tabellen met de kolommen 'id' en 'id_2', is dat niet het geval
T1 JOIN T2 USING(id) JOIN T3 USING(id_2)
word
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)
of
T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)
of weer iets anders?
Dit uitzoeken voor een bepaalde databaseversie is een vrij triviale oefening, maar ik heb er niet veel vertrouwen in dat het consistent is in alle databases, en ik ben niet de enige persoon die mijn code moet onderhouden (dus de andere mensen zullen ook moeten weten waar het gelijk aan is).
Een duidelijk verschil met de WHERE vs ON is of de join buitenste is:
Uitgaande van een T1 met een enkel ID-veld, een rij met de waarde 1 en een T2 met een ID en VALUE-veld (een rij, ID=1, VALUE=6), dan krijgen we:
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42
geeft geen rijen, omdat de WHERE moet overeenkomen, terwijl
SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)
geeft een rij met de waarden
1, NULL, NULL
omdat de AAN alleen nodig is voor het matchen van de join, wat optioneel is omdat het outer is.