Alla frågor som involverar mer än en tabell kräver någon form av association för att länka resultaten från tabell "A" till tabell "B". Det traditionella (ANSI-89) sättet att göra detta är att:
- Lista tabellerna som ingår i en kommaseparerad lista i FROM-satsen
-
Skriv kopplingen mellan tabellerna i WHERE-satsen
SELECT * FROM TABLE_A a, TABLE_B b WHERE a.id = b.id
Här är frågan omskriven med ANSI-92 JOIN-syntax:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
Ur ett prestationsperspektiv:
Där det stöds (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+) finns det ingen prestandafördel med att använda endera syntaxen framför den andra. Optimeraren ser dem som samma fråga. Men mer komplexa frågor kan dra nytta av att använda ANSI-92-syntax:
- Möjlighet att kontrollera JOIN-ordning - ordningen som tabeller ska skannas
- Möjlighet att tillämpa filterkriterier på en tabell innan du går med
Ur ett underhållsperspektiv:
Det finns många anledningar att använda ANSI-92 JOIN-syntax över ANSI-89:
- Mer läsbar, eftersom JOIN-kriteriet är separat från WHERE-satsen
- Mindre sannolikt att missa JOIN-kriterier
- Konsekvent syntaxstöd för andra JOIN-typer än INNER, vilket gör frågor lätta att använda i andra databaser
- WHERE-satsen fungerar endast som filtrering av den kartesiska produkten av de sammanfogade tabellerna
Ur ett designperspektiv:
ANSI-92 JOIN-syntax är mönster, inte antimönster:
- Syftet med frågan är mer uppenbart; kolumnerna som används av programmet är tydliga
- Den följer modularitetsregeln om att använda strikt skrivning när det är möjligt. Explicit är nästan universellt bättre.
Slutsats
Med undantag för förtrogenhet och/eller komfort ser jag ingen fördel med att fortsätta använda ANSI-89 WHERE-satsen istället för ANSI-92 JOIN-syntaxen. Vissa kanske klagar på att ANSI-92-syntaxen är mer utförlig, men det är det som gör den explicit. Ju mer explicit, desto lättare är det att förstå och underhålla.