Avatar billede odsgaard Praktikant
07. juni 2010 - 22:53 Der er 4 kommentarer og
1 løsning

Vælge funktioner der er dobbelt besat - eller funktioner der ikke er besat

Hej Eksperter

Jeg har følgende tabeller i en database.

CREATE TABLE person (
    personId int,
    navn varchar(50),
    funktion int FOREIGN KEY REFERENCES funktion(funktionsId),
    PRIMARY KEY (personId)
)

CREATE TABLE funktion (
    funktionsId int,
    navn varchar(50),
    PRIMARY KEY (funktionsId)
)

Tabellen funktion indeholder de funktioner der er i firmaet - og persontabellen de ansatte.

Jeg har nu prøvet et par timer at få lavet 2 sql sætninger, der kan give mig følgende resultat:

- en liste over funktioner, der ikke er besat
- en liste over funktioner, der er besat med 2 eller flere personer

Nogle der kan hjælpe mig henover den lille forhindring jeg er rendt ind i :)

På forhånd tak
Brian
Avatar billede Syska Mester
07. juni 2010 - 23:06 #1
1)
select * from funktion F
left join person P ON F.funktionid = p.personid
where personid IS NULL

2)
SELECT F.funktionid, F.Navn FROM person P
INNER JOIN funktion F ON P.funktionid = F.funktionid
HAVING COUNT(*) > 1
GROUP BY funktionid, F.Navn

Jeg er lidt i tvivl om den Having, mener den skal være der ... ellers efter GROUP BY

Det er ikke prøvet ... men burde give dig en ide om hvordan det kan løses hvis min kode ikke virker i første hug :-)

mvh
Avatar billede arne_v Ekspert
08. juni 2010 - 00:09 #2
De bør virke. Dog med F.funktionid = p.funktion og HAVING til sidst.

Jeg ville nok lave den første som:

select * from funktion F
where funktionid not in (select funktion from person)

men det er kun af æstetiske årsager
Avatar billede Syska Mester
08. juni 2010 - 00:24 #3
hehe, tror bare jeg antog at den også hed "funktionid" i den anden table :-)
Avatar billede odsgaard Praktikant
08. juni 2010 - 00:36 #4
Følgende 2 sætninger giver de ønskede resultater

1/
select * from funktion f
left join person p on f.funktionsid = p.funktion
where p.personid is null

2/
select f.funktionsid, f.navn
from person p
inner join funktion f on f.funktionsid = p.funktion
group by f.funktionsid, f.navn
having count(*) > 1


hvis i smider et svar, så bliver der uddelt point :)

Tak for hjælpen

/Brian
Avatar billede Syska Mester
08. juni 2010 - 00:43 #5
svar
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