Gå til innhold

Anbefalte innlegg

Videoannonse
Annonse

Regner med det er SQL du snakker om.

Der brukes man en eller annen form for join når du velger noe fra flere tabeller på en gang.

Hvis du skriver at du skal ha to tabeller, får du et kartesisk produkt av de to tabellene. Det vil si en ny tabell med alle mulige kombinasjoner av rader fra den ene og den andre. Har du en kolonne og ti rader i hver av to tabeller, der den ene inneholder tallene 0-9 og den andre bokstavene A-J, vil du få 100 rader i den midlertidige tabellen. 0A, 0B, 0C, ... , 9G, 9H, 9I, 9J.

Så kommer joins inn i bildet. For som regel kobler du sammen to tabeller som hører sammen, ved at en av tabellene har en kolonne med en fremmednøkkel, som hører til en primary key i den andre tabellen.

Og skal du feks lage et forum, og velge noen poster og samtidig hente nicket til forfatteren fra en annen tabell, så får du da en midlertidig tabell med masse rader. For hver post får du masse rader der alle postene finnes i en kombinasjon med alle brukerene. Men du ønsker bare de radene der brukerens id stemmer med posterens id.

Derfor skriver du

SELECT * FROM poster, brukere WHERE poster.forfatterid = brukere.id

Da filtreres bort alle de "gale" radene, og du får en rad for hver post i poster-tabellen, med riktige opplysninger om brukeren som skrev posten.

 

Dette er en join, selv om man ikke bruker JOIN-nøkkelordet.

Linja under gjør det samme, med JOIN-ordet:

SELECT * FROM poster INNER JOIN brukere ON poster.forfatterid = brukere.id

 

RIGHT JOIN og LEFT JOIN brukes likt som INNER JOIN, men disse returnerer også rader der det ikke finnes noen match. Feks hvis du sletter en bruker, uten å slette postene hans, så vil right/left returnere alle disse postene men ha NULL-verdier i bruker-kolonnnene. Brukere uten poster vil ikke bli returnert.

RIGHT/LEFT er omtrent like, men det er forskjellig hvilken tabell de viser til som skal bli med (vise brukere uten poster eller poster uten brukere).

Disse spørringene returnerer det samme:

SELECT * FROM poster RIGHT JOIN brukere ON ...

SELECT * FROM brukere LEFT JOIN poster ON ...

 

OUTER JOIN vil vise både brukere uten poster og poster uten brukere, og fyller på med NULL-verdier der den ikke finner noen match. I tillegg får du altså en rad for hver post, med riktig brukerinfo i raden.

 

Håper det ble litt forståelig, i det minste. Og et lite forbehold om at jeg kan ha misforstått noe, er ikke så ofte jeg bruker dette.

 

Se ellers http://w3schools.com/sql/sql_join.asp og http://en.wikipedia.org/wiki/Join_(SQL), de har litt eksempeltabeller og sånt.

Lenke til kommentar

Takker, har også lurt litt på dette. Men har så langt klart meg uten bruk av join, eller i alle fall uten bruk av de ordene. Er vant med (Oracle) sql, og har derfor klart meg med ... FROM tab1 t, tab2 tt WHERE t.id=tt.fid ... noe som også er kortere å skrive. Men det ser ut som de forskjellige JOIN gir deg noe bedre kontroll på hva som blir retunert og hvordan.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...