Avatar billede hansjacob Nybegynder
22. juli 2008 - 00:42 Der er 4 kommentarer og
1 løsning

JOIN skal kun tage første forekomst

Hej,

Hvordan laver jeg en JOIN, hvor kun den første forekomst i den anden tabel bliver taget?

t1:
navn    id
Jacob  4
Peter  5

t2:
id      transport
4      cykel
4      bil
4      tog
5      bil
5      cykel

Når man laver den join, som jeg kunne tænke mig, skal output være

Jacob  cykel
Peter  bil

Altså joinen finder jacob og finder så første forekomst i t2.

På forhånd tak for hjælpen.

VH Jacob
Avatar billede arne_v Ekspert
22. juli 2008 - 04:03 #1
Problemet er ikke beskrevet godt nok.

Data i en tabel er principielt uordnet.

Du er nødt til at vælge et kriterie som afhænfer af data.
Avatar billede hansjacob Nybegynder
22. juli 2008 - 07:28 #2
OK.

t2 indeholder referencer til t1 via id. Derudover kan den så have en index. Altså t2:
id  id_t1ref  transport
1    4        cykel
2    4        bil
3    4        tog
4    5        bil
5    5        cykel

Hvis jeg nu laver min normale join:
SELECT navn,tranport FROM t1 JOIN t2 ON t1.id=t2.id_t1ref
Output:
navn  transport
jacob  cykel
jacob  bil
jacob  tog
peter  bil
peter  cykel


Problemet er, at jeg helst ikke vil have gentagelser af data fra navnet. Jeg vil blot have følgende output:

navn  transport
jacob  cykel
peter  bil

(Jeg kan af andre grunde ikke bruge group by t1.navn)

Jeg håber det hjalp lidt på klarheden.

Venlig hilsen Jacob
Avatar billede kjulius Novice
22. juli 2008 - 20:13 #3
Der er to forskellige muligheder:

1) Du er reelt ligeglad med, om det er den først registrerede værdi, der returneres. Her byder en gruppering på navn med enten en MIN eller MAX funktion på transport sig til:

SELECT navn, MIN(t2.tranport) AS transport
FROM t1 JOIN t2 ON t1.id=t2.id_t1ref
GROUP BY navn


2) Du bruger en subselect til at indkredse den t2.id, som er lavest, hvorved du får udvalgt den tidligst registrerede transport(metode):

SELECT navn,tranport
FROM t1 JOIN t2 ON t1.id=t2.id_t1ref
WHERE t2.id = (SELECT MIN(id) FROM t2 as t2s where id_t1ref = t2.id)
Avatar billede hansjacob Nybegynder
27. juli 2008 - 19:30 #4
... selvfølgelig... tsk tsk.

Kom med et svar, så skal jeg give point.

VH Jacob
Avatar billede kjulius Novice
27. juli 2008 - 20:53 #5
Kommer her... :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester