Enhver forespørgsel, der involverer mere end én tabel, kræver en form for tilknytning for at linke resultaterne fra tabel "A" til tabel "B". Den traditionelle (ANSI-89) måde at gøre dette på er at:
- Angiv tabellerne involveret i en kommasepareret liste i FROM-sætningen
-
Skriv sammenhængen mellem tabellerne i WHERE-sætningen
SELECT * FROM TABLE_A a, TABLE_B b WHERE a.id = b.id
Her er forespørgslen omskrevet ved hjælp af ANSI-92 JOIN-syntaks:
SELECT *
FROM TABLE_A a
JOIN TABLE_B b ON b.id = a.id
Fra et præstationsperspektiv:
Hvor det understøttes (Oracle 9i+, PostgreSQL 7.2+, MySQL 3.23+, SQL Server 2000+), er der ingen ydeevnefordele ved at bruge den ene syntaks frem for den anden. Optimeringsværktøjet ser dem som den samme forespørgsel. Men mere komplekse forespørgsler kan drage fordel af at bruge ANSI-92-syntaks:
- Mulighed for at kontrollere JOIN-rækkefølgen - rækkefølgen, som tabeller scannes
- Mulighed for at anvende filterkriterier på en tabel før tilmelding
Ud fra et vedligeholdelsesperspektiv:
Der er adskillige grunde til at bruge ANSI-92 JOIN-syntaks over ANSI-89:
- Mere læsbar, da JOIN-kriterierne er adskilt fra WHERE-sætningen
- Mindre sandsynlighed for at gå glip af JOIN-kriterier
- Konsekvent syntaksunderstøttelse for andre JOIN-typer end INNER, hvilket gør forespørgsler nemme at bruge på andre databaser
- WHERE-sætningen tjener kun som filtrering af det kartesiske produkt af de sammenføjede tabeller
Fra et designperspektiv:
ANSI-92 JOIN-syntaks er mønster, ikke anti-mønster:
- Formålet med forespørgslen er mere indlysende; kolonnerne, der bruges af applikationen, er klare
- Den følger modularitetsreglen om at bruge streng indtastning, når det er muligt. Eksplicit er næsten universelt bedre.
Konklusion
Uden kendskab og/eller komfort ser jeg ingen fordel ved at fortsætte med at bruge ANSI-89 WHERE-sætningen i stedet for ANSI-92 JOIN-syntaksen. Nogle vil måske klage over, at ANSI-92-syntaksen er mere omfattende, men det er det, der gør den eksplicit. Jo mere eksplicit, jo lettere er det at forstå og vedligeholde.