En join brukes til sammenslåing av tabeller
En equi-join er en sammenslåing på likhet(= eller LIKE).
Lag en liste med navnet på alle pasienter select navn from menneske m, pasient p where m.personnr LIKE p.personnr; navn ----------------- Arne B. Olsen Ilma S. Arnesen Eivind Moen Sebastian Soby Anne Andersen Helga Halstensen (6 rows)
En theta-join er en sammenslåing på likhet/ulikhet eller størrelse(=, LIKE, !=, <, > osv).
Finn pasient_id, lege_id og dato for legebesøk for alle pasienter med pasient_id mindre enn lege_id til legen de ble behandlet av select pasient_id, lege_id, dato_legebesok from besoksJournal bj, lege l where bj.pasient_id < l.lege_id and bj.id_behandler = l.lege_id; pasient_id | lege_id | dato_legebesok ------------+---------+--------------------- 2 | 3 | 2001-04-23 10:45:00 4 | 5 | 2003-12-10 08:45:00 1 | 6 | 2001-10-14 08:15:00 (3 rows)
Kalles også kartesisk produkt.
En cross-join er en sammenslåing hvor alle tupler i den ene tabellen slås sammen med alle tupler i en annen tabell.
Skriv id til alle legekontor og leger select legekontor_id, lege_id from legekontor, lege; legekontor_id | lege_id ---------------+--------- 1 | 1 1 | 2 1 | 3 1 | 4 1 | 5 1 | 6 1 | 7 2 | 1 2 | 2 2 | 3 2 | 4 2 | 5 2 | 6 2 | 7 3 | 1 3 | 2 3 | 3 3 | 4 3 | 5 3 | 6 3 | 7 4 | 1 4 | 2 4 | 3 4 | 4 4 | 5 4 | 6 4 | 7 (28 rows)
I en self-join sammenligner man verdier i en og samme tabell.
Hent pasient_id og dato for legebesøk for alle pasienter behandlet av samme lege select bj1.pasient_id, bj1.dato_legebesok from besoksJournal bj1, besoksJournal bj2 where bj1.id_behandler = bj2.id_behandler and bj1.pasient_id != bj2.pasient_id; pasient_id | dato_legebesok ------------+--------------------- 2 | 2001-04-23 10:45:00 3 | 2002-02-06 14:30:00 (2 rows)
I en left outer-join slår man sammen gitte tupler i en tabell med gitte tupler i en annen tabell,
og begrenser spørringen med en equi-join på primærnøklene i begge tabeller.
Resultatet av en left outer-join er alle treff i venstre tabell slått sammen med alle
i høyre tabell pluss alle gjenværende tupler i venstre tabell med verdien NULL for de høyre verdiene.
Finn id og navn på alle legekontor og id og internt telefonnr til evt. leger som jobber der select lk.legekontor_id, lk.navn, l.lege_id, l.tlf_intern from legeKontor lk, lege l where lk.legekontor_id = l.legekontor union select lk.legekontor_id, lk.navn, NULL, NULL from legekontor lk where not exists (select * from lege l where lk.legekontor_id = l.legekontor); legekontor_id | navn | lege_id | tlf_intern ---------------+------------------------+---------+------------ 1 | Jarpastelia Legekontor | 1 | 3214 1 | Jarpastelia Legekontor | 2 | 3215 1 | Jarpastelia Legekontor | 3 | 3216 1 | Jarpastelia Legekontor | 5 | 3218 2 | Jarpast-spesialistene | 6 | 1035 3 | Sentrum Legesenter | 4 | 1113 4 | Det Tomme Legesenter | | (7 rows)
I en right outer-join slår man sammen gitte tupler i en tabell med gitte tupler i en annen tabell,
og begrenser spørringen med en equi-join på primærnøklene i begge tabeller.
Resultatet av en right outer-join er alle treff i høyre tabell slått sammen med alle
i venstre tabell pluss alle gjenværende tupler i høyre tabell med verdien NULL for de venstre verdiene.
Finn all informasjon om alle leger og navn på legekontoret de evt. jobber på select lk.legekontor_id, lk.navn, l.lege_id, l.tlf_intern from legeKontor lk, lege l where lk.legekontor_id = l.legekontor union select NULL, NULL, l.lege_id, l.tlf_intern from lege l where not exists (select * from legeKontor lk where lk.legekontor_id = l.legekontor); legekontor_id | navn | lege_id | tlf_intern ---------------+------------------------+---------+------------ 1 | Jarpastelia Legekontor | 1 | 3214 1 | Jarpastelia Legekontor | 2 | 3215 1 | Jarpastelia Legekontor | 3 | 3216 1 | Jarpastelia Legekontor | 5 | 3218 2 | Jarpast-spesialistene | 6 | 1035 3 | Sentrum Legesenter | 4 | 1113 | | 7 | (7 rows)
I en full outer-join slår man sammen gitte tupler i en tabell med gitte tupler i en annen tabell,
og begrenser spørringen med en equi-join på primærnøklene i begge tabeller.
Resultatet av en full outer-join er alle treff i venstre tabell slått sammen med alle
i høyre tabell pluss alle gjenværende tupler i venstre tabell med verdien NULL for de høyre verdiene
pluss alle gjenværende tupler i høyre tabell med verdien NULL for de venstre verdiene.
Lag liste med id og navn på alle legekontor og id og internt telefonnummer for alle leger select lk.legekontor_id, lk.navn, l.lege_id, l.tlf_intern from legeKontor lk, lege l where lk.legekontor_id = l.legekontor union select NULL, NULL, l.lege_id, l.tlf_intern from lege l where not exists (select * from legeKontor lk where lk.legekontor_id = l.legekontor) union select lk.legekontor_id, lk.navn, NULL, NULL from legekontor lk where not exists (select * from lege l where lk.legekontor_id = l.legekontor); legekontor_id | navn | lege_id | tlf_intern ---------------+------------------------+---------+------------ 1 | Jarpastelia Legekontor | 1 | 3214 1 | Jarpastelia Legekontor | 2 | 3215 1 | Jarpastelia Legekontor | 3 | 3216 1 | Jarpastelia Legekontor | 5 | 3218 2 | Jarpast-spesialistene | 6 | 1035 3 | Sentrum Legesenter | 4 | 1113 4 | Det Tomme Legesenter | | | | 7 | (8 rows)