sql >> Databasteknik >  >> RDS >> Mysql

Vad är skillnaden mellan att använda och på i tabellanslutningar i MySQL?

Jag använder inte syntaxen USING, eftersom

  1. de flesta av mina anslutningar är inte lämpade för det (inte samma fältnamn som matchas, och/eller flera matchningar i anslutningen) och
  2. det är inte direkt uppenbart vad det betyder i fallet med fler än två tabeller

dvs om vi antar 3 tabeller med kolumner 'id' och 'id_2', gör det

T1 JOIN T2 USING(id) JOIN T3 USING(id_2)

bli

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T1.id_2=T3.id_2 AND T2.id_2=T3.id_2)

eller

T1 JOIN T2 ON(T1.id=T2.id) JOIN T3 ON(T2.id_2=T3.id_2)

eller något annat igen?

Att ta reda på detta för en viss databasversion är en ganska trivial övning, men jag har inte så stor tilltro till att det är konsekvent i alla databaser, och jag är inte den enda personen som måste underhålla min kod (så andra människor måste också vara medvetna om vad det motsvarar).

En uppenbar skillnad med WHERE vs ON är om kopplingen är yttre:

Om vi ​​antar en T1 med ett enda ID-fält, en rad som innehåller värdet 1 och en T2 med ett ID- och VALUE-fält (en rad, ID=1, VALUE=6), så får vi:

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID) WHERE T2.VALUE=42

ger inga rader, eftersom WHERE krävs för att matcha, medan

SELECT T1.ID, T2.ID, T2.VALUE FROM T1 LEFT OUTER JOIN T2 ON(T1.ID=T2.ID AND T2.VALUE=42)

kommer att ge en rad med värdena

1, NULL, NULL

eftersom ON endast krävs för att matcha sammanfogningen, vilket är valfritt på grund av att det är yttre.



  1. Hur man öppnar en databas i exklusivt läge i Access 2016

  2. Vyn ALL_PROCEDURES visar inte PROCEDURE_NAME

  3. C#:Objekt kan inte castas från DbNull till andra typer

  4. Oracle IN vs finns skillnad?