jag hade precis tänkt att lär mig join... men jag fattade inte vad skillnaden var...
kan någon förklara lite närmare för mig?
/ Mikul
------------------
vad är det för fel mad att vara lat?, tänk om det blev krig och ingen kom dit.
9 svar · 2 716 visningar · startad av mikul
jag hade precis tänkt att lär mig join... men jag fattade inte vad skillnaden var...
kan någon förklara lite närmare för mig?
/ Mikul
------------------
vad är det för fel mad att vara lat?, tänk om det blev krig och ingen kom dit.
Sök, jag har nog förklarat det 5 gånger i olika inlägg.
------------------
essentitia preter non sans multiplicandum
ok.... ska försöka...
/ Mikul
------------------
vad är det för fel mad att vara lat?, tänk om det blev krig och ingen kom dit.
hej igen...
jag lyckas facktiskt inte hitta nåt inlägg som förklarar skillnaden mellan left, right och inner join...
du har inte lust att skriva lite snabbt om det i alla fall??
/ Mikul
------------------
vad är det för fel mad att vara lat?, tänk om det blev krig och ingen kom dit.
Skillnad mellan inner join och outer join
En inner join mellan två tabeller kan skrivas på flera sätt, dessa två är de
vanligaste
select DESCRIPTION, COST
from CHARGES, BILL
where BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
and RESERVATION = 1349
select DESCRIPTION, COST
from CHARGES inner join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
where RESERVATION = 1349
Dvs returnera alla poster där värdena i kolumnen BILL.CHARGE_CODE är lika med
värdena CHARGES.CHARGE_CODE och charges.RESERVATION har värdet 1349
Resultat
[red]
DESCRIPTION COST
ROOM 800
CAR PARK 70
MISCELLANEOUS 30
3 rows found
Att skriva villkoret i from eller i where är bara en syntaktisk skillnad och har
ingen betydelse för prestanda. Man anger bara vilka poster man vill ha och inte hur
dessa skall hämtas.
I exemplen så använder jag = i villkoret. Det kallas för en equi-join och är det
absoluta vanligaste, men man kan använda vilka villkor som helst och ha komplexa
uttryck med and och or.
Eftersom resultatet av en join är en tabell så går det att joina detta resultat
med en annan tabell
select GUEST_LNAME,GUEST_FNAME,DESCRIPTION,COST
from BOOK_GUEST as BG,CHARGES as C,BILL as B
where BG.RESERVATION = 1349
and BG.RESERVATION = C.RESERVATION
and C.CHARGE_CODE = B.CHARGE_CODE
Resultat
[red]
GUEST_LNAME GUEST_FNAME DESCRIPTION COST
HESTSON ANNIKA ROOM 800
HESTSON ANNIKA CAR PARK 70
HESTSON ANNIKA MISCELLANEOUS 30
3 rows found
[/red]
En left outer join anges alltid i from och kan se ut så här
select DESCRIPTION, COST
from CHARGES left outer join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
and RESERVATION = 1349
Resultat
DESCRIPTION COST
ROOM 800
CAR PARK 70
MISCELLANEOUS 30
LAUNDRY <null>
MINI BAR <null>
RESTAURANT <null>
6 rows found
[/red]
Skillnaden mot en inner join är att man får alla rader från den tabellen som står
till vänster i joinklausulen. Om det finns poster i den högra tabellen som uppfyller
joinvillkoret så får man dessa annars så får man en post med null i de kolumner som
kommer från den högra tabellen.
Det är ingen egentlig skillnad mellan en left outer join och en right outer join. Man
kan skriva om ovanstående left outer join som en right outer join
select DESCRIPTION, COST
from BILL right outer join CHARGES on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
and RESERVATION = 1349
som ger samma resultat.
Det går att kombinera inner join och outer join
select GUEST_LNAME,GUEST_FNAME,DESCRIPTION,COST
from (BOOK_GUEST BG inner join CHARGES C on BG.RESERVATION = C.RESERVATION)
left outer join BILL B on C.CHARGE_CODE = B.CHARGE_CODE
where BG.RESERVATION = 1349
I det här fallet så är det inte speciellt relevant eftersom det kommer att bli samma
resultat som om det varit enbart inner join. (Varför?)
Det finns även några andra typer av join som omnämns, de är dock inte så vanligt att
olika databashanterare har stöd för dem
Natural join innebär att man joinar på alla kolumner med samma namn i de båda tabellerna.
select DESCRIPTION,COST
from CHARGES natural join BILL
eller
select DESCRIPTION,COST
from CHARGES natural left join BILL
Enligt sql-standard så kan man utelämna orden inner och outer, men det verkar vara några
dbms som trots det kräver att man anger dem.
Cross join innebär att man får kryssprodukten av alla rader i de båda tabellerna
select *
from CHARGES cross join BILL
Full join är unionen av en left join och right join mellan två tabeller
select *
from CHARGES full join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
Man får alla poster som uppfyller join-villkoret, alla poster i den vänstra tabellen
som inte uppfyller villkoret och alla poster i den högra tabellen som inte uppfyller
villkoret.
Den kan också skrivas som
select DESCRIPTION, COST
from CHARGES left outer join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
where CHARGES.CHARGE_CODE is null
union all
select DESCRIPTION,COST
from CHARGES inner join BILL
on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
union all
select DESCRIPTION, COST
from CHARGES right outer join BILL on BILL.CHARGE_CODE = CHARGES.CHARGE_CODE
where BILL.CHARGE_CODE is null
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 09 feb 2002]
Tack så mycket LarsG...
nu fattar jag lite mer i alla fall...
men det är fortfarande några saker som är oklart för mig och som jag inte riktigt fattade vad du menade med...
exempelvis:
vad menar du med "kryssprodukten"?
och sen fattade jag inte extákt vad outer left/right join gör som inte inner join gör och tvärtom...
förlåt om jag är jobbig, men det måste ju finnas dumma människor oxå om det ska finnas smarta... ;-)
/ Mikul
------------------
vad är det för fel mad att vara lat?, tänk om det blev krig och ingen kom dit.
Kryssprodukt innebär att du får alla möjliga kombinationer av poster från båda tabellerna.
Jag tänkte att detta skulle beskriva skillnaden
Skillnaden mot en inner join är att man får alla rader från den tabellen som står
till vänster i joinklausulen. Om det finns poster i den högra tabellen som uppfyller
joinvillkoret så får man dessa annars så får man en post med null i de kolumner som kommer från den högra tabellen.Det är ingen egentlig skillnad mellan en left outer join och en right outer join. Man kan skriva om ovanstående left outer join som en right outer join
Vad är det som är oklart?
------------------
essentitia preter non sans multiplicandum
[Redigerat av LarsG den 09 feb 2002]
man får alla rader från den tabellen som står till vänster i joinklausulen.
vilken är den vänstra resp högra i den här koden:
select field1, field2
from table1 left outer join table2 on table2.field3 = table1.field3
and field4 = 'fråga'
och vad menar du med "joinklausulen"?
sen tror jag att jag fattade resten...
nu ska jag åka och bowla :D jippi! cu!
/ Mikul
------------------
vad är det för fel mad att vara lat?, tänk om det blev krig och ingen kom dit.
table1 är vänstra
join-klausul är hela uttrycket
table1 left outer join table2 on table2.field3 = table1.field3
and field4 = 'fråga'
------------------
essentitia preter non sans multiplicandum
Tack så mycket LarsG...
nu fattar jag lite mer i allafall... tror jag...hehe...
jag skickade ett mail till dig för ett tag sedan...
men du svarade inte...
du kan ju ta en titt om dy hittar nåt gammalt mail från mikul@allehanda.net som ligger och skräpar...
;)
ha det så bra så länge..
/ Mikul
------------------
vad är det för fel mad att vara lat?, tänk om det blev krig och ingen kom dit.