Join

En join brukes til sammenslåing av tabeller

Equi-join

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)

Theta-join

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)

Cross-join

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)

Self-join

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)

Left outer-join

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)

Right outer-join

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)

Full outer-join

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)