OUTER JOIN se vanha kunnon kaveri Ulkoliitoksia on kolmenlaisia Left -> vasemmasta taulusta otetaan ehdot täyttävät rivit ja yhdistetään oikeanpuoleiseen tauluun jos rivi löytyy - nested loop join Right -> oikeanpuoleisesta taulusta otetaan ehdot täyttävät rivit ja yhdistetään vasempaan tauluun jos rivi löytyy nested loop join FULL -> otetaan kaikki ehdot täyttävät rivit oikeanpuoleisesta taulusta ja vasemmasta taulusta ja liitetään vastausjoukkojen rivit, molemmista tauluista voi puuttua vastinpari merge scan join Max 225 taulua, inner, full, left ja right sekaisin 1
OUTER JOIN - esimerkki Select l.sar1,..., r.sarx From tleft l left outer join tright r On l.key = r.key and l.sar2= kissa WHERE ehto vasemman, tleft, taulun tietoihin 2
Kenellä on kissa? select nimi, lemmikki, osastonimi, alue from testi.tleft l left outer join testi.tright r on l.osasto = r.osasto WHERE LEMMIKKI = 'KISSA' order by nimi ; ANNELI KISSA ---------- ---------- ERJA KISSA OSTOT LÄNSI KAISA KISSA OSTOT LÄNSI LIISA KISSA ---------- ---------- PEKKA KISSA MYYNNIT ETELÄ RISTO KISSA OSTOT LÄNSI RISTO KISSA MYYNNIT ETELÄ RITVA KISSA OSTOT ETELÄ SARI KISSA MYYNNIT ETELÄ SEPPO KISSA ---------- ---------- SINIKKA KISSA OSTOT LÄNSI TARJA KISSA OSTOT LÄNSI VIKTOR KISSA OSTOT LÄNSI DSNE610I NUMBER OF ROWS DISPLAYED IS 13 3
Kaikki henkilöt, ja osastotiedot niille joilla on kissa select nimi, lemmikki, osastonimi, alue from testi.tleft l left outer join testi.tright r on l.osasto = r.osasto and LEMMIKKI = 'KISSA' order by nimi,osastonimi; NIMI LEMMIKKI OSASTONIMI ALUE ---------+---------+---------+---------+---------+---- ANNELI KISSA ---------- ---------- ERJA KISSA OSTOT LÄNSI HARRI KOIRA ---------- ---------- ILKKA KOIRA ---------- ---------- JAANA KOIRA ---------- ---------- JAANA KOIRA ---------- ---------- JAANA KOIRA ---------- ---------- JORMA KOIRA ---------- ---------- JUHA KOIRA ---------- ---------- KAISA KISSA OSTOT LÄNSI MERJA FRETTI ---------- ---------- PEKKA KISSA MYYNNIT ETELÄ 4
OUTER JOIN - esimerkki kolmas taulu Select l.sar1,..., r.sarx, m.sary From tleft l left outer join tright r On l.key = r.key and l.sar2= kissa Left outer join tmostouter m ON r.key1=m.key1 and r.key2=m.key2 WHERE ehto vasemman, tleft, taulun tietoihin 5
OUTER JOIN huomaa Left join ei where ehtoa oikean puoleiseen tauluun Right join - ei where ehtoa vasemman puoleiseen tauluun Full join ei where ehtoa Jos sääntöä rikkoo on lopputulos innerjoin ja DB2 kirjoittaa lauseen uudelleen sisäliitokseksi Tulee sama väärä vastaus, mutta nopeammin sanoi Bonnie Baker 6
OUTER JOIN suoritusjärjestys: 1. Join ja on-lauseet 2. (group by) 3. Select 4. where 7
FROM tleft l LEFT JOIN tright r ON l.key=r.key WHERE l.nimi like S% Kirjoitetaan uudelleen FROM (SELECT FROM tleft WHERE nimi like S% ) AS l LEFT JOIN tright r ON l.key = r.key 8
Outerjoinin uudelleenkirjoitus Ulkoliitoksessa kirjoitetaan lause uudelleen Liitosjärjestys tehokkaammaksi Oikein kirjoitettu where-ehto nostetaan ylöspäin Väärin kirjoitettu where-ehto -> inner join Lisäksi tapahtuu samoja uudelleenkirjoituksia kuin sisäliitoksessakin Jos a.sar1 = b.sarx ja a.sar1=10 -> b.sarx=10 Join kirjoitetaan alikyselyksi jos tehokkaampi (ja päinvastoin) Taulujen liitosjärjestys 9
ENTÄS JOS ON PAKKO LAITTAA EHTO VÄÄRÄN PUOLEN TAULUUN? Joskus auttaa lisäehto or sar is null Hakupolku? Eikä se aina edes auta, ks. esimerkki 10
Ari Hovin kirjasta Jos on where-ehto vain oikeanpuoleiseen tauluun, tämä ei kaikilla aineistoilla toimi: jos oikeanpuoleisessa taulussa on sarake KUNTA, määritelty null-arvoiseksi jää rivi pois. Ari Hovin kirjan esimerkki: SELECT O.OSTUN, O.OSNIMI, SNIMI, KUNTA FROM OSASTO O LEFT JOIN HENKILO H ON O.OSTUN = H.OSTUN WHERE KUNTA = 'TURKU ORDER BY O.OSTUN, H.SNIMI 11
Ari Hovin kirjasta 2 tästä lauseesta jää pois kaksi osastoa, joissa ei ole ketään Turusta. Talousosasto, kunta 'NULL' ja Markkinointi kunta 'HELSINKI'. RATKAISU: SELECT OS.OSTUN, OS.OSNIMI, H.SNIMI, H.KUNTA FROM OSASTO OS LEFT JOIN (SELECT SNIMI, KUNTA, OSTUN FROM HENKILP WHERE KUNTA = 'TURKU') H ON OS.OSTUN=H.OSTUN ORDER BY OS.OSTUN, H.SNIMI 12