Birger Sørensen wrote:
> Stig Johansen frembragte:
> 8X
>> PS: Måske skal vi forklare Phillipo hvad forskeller er på INNER/LEFT
>> OUTER/RIGHT OUTER - JOIN er - når/hvis han kommer så langt.
>
> Det kunne da godt være, at der var nogen af os andre, der kunne have
> glæde af en såden forklaring...?
Selvfølgelig Birger, men den slags er typisk afhængig af den aktuelle
opgave.
Men jeg kan godt lave en kort 'forklaring':
Antag vi har to tabeller A og B.
A indeholder:
id
----
1
2
3
B indeholder
id
----
2
3
4
Nu er jeg gået et (lille) skridt videre i forhold til Philips indlæg, hvor
han har id og pid (så vidt jeg kan se).
Så går vi i gang med nogle forespørgsler.
1) Vi vil gerne have alle id'er fra tabel A - SELECT id FROM A.
Databaser indeholder ikke nogen 'naturlig' rækkefølge, så for at garantere
rækkefølgen skal man have en SORT BY, så
2) SELECT id FROM A ORDER BY id (evt desc for faldende orden).
Nu vil vi gerne sammenkoble de to tabeller og se
3) Hvad er fælles forekomster i de 2 tabeller - SELECT
t1.id FROM A t1 INNER
JOIN B t2 ON
t2.id=
t1.id
Resultatet bliver:
id
-----
2
3
Her fortæller vi databasen hvilke felter der skal matche, id i begge
tilfælde.
Men når man bruger samme feltnavn skal databasen skelne mellem 'ambiguity',
så derfor bruges alias, så A -> t1 og B -> t2.
INNER JOIN giver med andre ord 'fællesmængeden' mellem de to tabeller.
Vi kan også stille et andet spørgsmål:
"Giv mig alle data fra A med tilhørende data fra B uanset om der er et
'tilhørsforhold'.
Det giver dette SQL:
4) SELECT
t1.id AS f1,
t2.id AS f2 FROM A t1 LEFT OUTER JOIN B t2 on
t2.id=
t1.id
og resultatet:
f1 f2
---- -----
1 null
2 2
3 3
Denne SQL kan også bruges til at finde ikke sammenhængende entries i tabel B
ved at udvide den med en where klausul:
5) SELECT
t1.id AS f1,
t2.id AS f2 FROM A t1 LEFT OUTER JOIN B t2 on
t2.id=
t1.id WHERE
t2.id IS NULL, så får man kun første række i forhold til
ovenstående.
Så er der RIGHT OUTER JOIN, som jeg aldrig bruger, men det går ud på at se
på tabellerne fra højre mod venster i stedet for venstre mod højre.
I ovenstående eksempel skal man blot bytte om på A og B, og bruge RIGHT i
stedet for LEFT, og resultatet vil være det samme.
Phillip var lidt inde på 3 (eller flere) tabeller, og princippet er det
samme.
F.eks.
SELECT A.id,B.noget,C.noget_mere
FROM A t1
(INNER/LEFT OUTER) JOIN B t2 ON t1.noget=t2.noget
(INNER/LEFT OUTER) JOIN C t3 ON t2.noget=t3.noget
......
WHERE 'noget'
ORDER BY 'noget'
....
evt
GROUP BY 'noget' hvis man vil have aggrerede data.
I princippet er vi ovre i .database gruppen, men den er lige så død som alle
de andre, so what....
PS: vær opmærksom på de forskellige afvigelser fra standarden, herunder
Phillips brug af ' som _kun_ virker i mySQL, og vil skabe problemer ved
skift af database.
MS SQLServer indsætter 'automagisk' [ og ], ved brug af deres værktøjer til
SQL generering.
Fjerne alt hvad der ikke er standard, eller helst:
SKRIV DIT SQL SELV!