Query: records die dubbel voorkomen met 1 verschillende kolom

  • Onderwerp starter Onderwerp starter JeV
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

JeV

Nieuwe gebruiker
Lid geworden
10 apr 2009
Berichten
2
Het voorbeeld is sterk vereenvoudigd om het probleem makkelijker te kunnen uitleggen. Ik heb een tabel met personeel, waarbij een regel voor ieder personeelslid bestaat die in dienst is gekomen. Als de medewerker uit dienst gaat, wordt een nieuwe regel aangemaakt. Niet echt netjes genormaliseerd, maargoed...

Voornaam Achternaam Indienst Uitdienst
Paul Jansen 1 0
Paul Jansen 0 1
Jan Klaassen 1 0
Truus de Mier 1 0
Henk de Vries 1 0
Henk de Vries 0 1
Pietje Puk 1 0
Ruud Lubbers 1 0
Pietje Puk 0 1

Ik ben nu op zoek naar de INdienstredingsregels van mensen die UIT dienst zijn.
De query moet als resultaat opleveren:

Paul Jansen 1 0
Henk de Vries 1 0
Pietje Puk 1 0

Een nested query werkt niet, omdat ik op meer dan 1 argument moet zoeken:
SELECT * FROM Personeel WHERE Voornaam, Achternaam IN (SELECT Voornaam, Achternaam FROM Personeel WHERE Uitdienst = 1)
Alleen op voornaam of alleen op achternaam zoeken is niet voldoende, omdat voornamen of achternamen niet uniek zijn. Ik heb geen personeelsnummer o.i.d., maar de combinatie voornaam, achternaam is uniek.
 
Laatst bewerkt:
probeer het volgende eens?

SELECT personeel.*
FROM personeel,
(SELECT voornaam, achternaam FROM personeel WHERE uitdienst = 1) personeeluitdienst
WHERE personeel.voornaam = personeeluitdienst.voornaam
AND personeel.achternaam = personeeluitdienst.achternaam
AND indienst = 1
 
Hm, ziet er goed uit.

Echter: ik heb 15155 records in de tabel waarvan 3050 met status Uitdienst.
Tegenover deze 3050 staan dus ook 3050 indiensttredingen.
Er zouden dus nog 9055 mensen in dienst moeten zijn (15155-3050-3050).

De query geeft 5626 regels als resultaat, wat te veel is (ik verwacht er 3050).

UPDATE: de oorzaak hiervan ligt in het feit dat er mensen zijn die indienst, uitdienst en weer indienst zijn (3 of zelfs meer regels dus). Deze worden door de query dubbel geteld. Een distinct geeft slecht 2526 regels, ruim 500 te weinig dus.

Ik denk dat de query prima is, maar dat het feit dat er regelmatig 3 of meer regels voor één personeelslid zijn het extra complex maakt.

Ik ben wel flink op weg geholpen, dus dankje!!
 
Laatst bewerkt:
Ok, ik neem aan dat je de oudste indienstregels wil en je een datum in het record hebt. Er kunnen dus meerdere in/uit regels zijn per persoon...

Probeer eens:
Code:
select p1.* from personeel p1 
where p1.datum <= (
   select min(datum) from personeel p2 
   where p2.uitdienst = 1 
   and p2.voornaam = p1.voornaam 
   and p2.achternaam = p1.achternaam
) 
and p1.indienst = 1
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan