15. marts 2002 - 10:19Der er
9 kommentarer og 1 løsning
Omvendt select - Men hvordan.
Hej,
Jeg har en interbase database med to tabeller; Personale og Vagtplan.
Personale indeholder blot personer. Vagtplan indeholder dato og tider samt hvilke personer der er knyttet til vagten.
Hvordan er det lige man laver en select indenfor en periode (det kan jeg godt finde ud af) hvor resultatet bliver alt det personale som ikke er inden for denne perioden. ??
Håber der er klogt hoved.
find alt personale som ikke er oprettet i vagtplanen mellem dato/tid1 og dato/tid2
Det nemmeste vil være hvis du har din forespørgsel, som finde de personer, som ER i vagtplanen for en given periode, lad os kande den for Personerivagt. Med et ID for personale, kaldet PersID.
Dernest laver du følgende:
SELECT Personale.* FROM Personale LEFT JOIN Personerivagt ON Personale.ID=Personerivagt.PersID WHERE Personerivagt Is Null;
den forespørgsel, du allerede har indeholder jo en form for ID på personale, derfor er din forespørgsel et godt udgangspunkt... Gem den som 'personaleivagt' og indtast min forespørgsel.
Bemærk, jeg kender IKKE dine feltnavne, så du må selv udbytte ID i personale og PersID i vagtplan, med de rigtige navne!!!
Er det ikke muligt at gemme forespørgsler i InterBase ??
Det jeg vil have dig til at gøre er at gemme forespørgslen, som du oprindeligt havde, og som fandt alle, som var på vagt i en given periode. (Den returnerer blandt andet et Medarbejdernr, som vi skal bruge nu)
Derefter laver du følgende SELECT: SELECT Personale.* FROM Personale LEFT JOIN Personaleivagt ON Personale.Medarbejdernr=Personaleivagt.Medarbejdernr WHERE Personaleivagt.Medarbejdernr Is Null;
Den returnerer alle fra Personale, som ikke er med i Personaleivagt (din gemte forespørgsel fra før)
select navn from Personale Left Join Vagtplan ON Personale.Medarbejdernr=Vagtplan.Medarbejdernr where Vagtplan.Dato >= '01-01-2001' and Vagtplan.Dato <= '01-03-2002'
Jeg fik denne her til at lykkedes - jeg tog din Is Null væk
Jeg er ikke 100 % sikker på om det er de rigtige medarbejdere den kommer tilbage med, men der kommer mange ens. Men jeg kan ikke fjerne dem med distinct ?!
Dette er IKKE rigtigt!! Det er netop kun de personer, som er MED i vagtplanen i perioden, som kommer ud.
Hvis InterBase undstøtter SUB-SELECT's kan du prøve med denne: SELECT DISTINCT Medarbejdernr, Navn FROM Personale WHERE Medarbejdernr NOT IN (SELECT Medarbejdernr FROM vagtplan WHERE Dato>='01-01-2001' AND Dato<='01-03-2002');
Netop ved at have en anden forespørgsel, som udvælger de records det IKKE skal være...
Det som der sker nu, er at for hver medarbejder i personale-tabellen slåes der op i vagtplan-tabellen, for at se om medarbejderen er med på listen over medarbejdere på vagt i perioden...
Ved at lave dette opslag i starten af processen, og derefter joine, ville dette kunne undgåes...
Jeg kender desværre ikke nok til InterBase til at kunne rådgive dig om,hvordan man kan gemme en forespørgsel, men jeg er overbevist om at det må kunne lade sig gøre, og at du derefter kan lave LEFT JOIN med Is Null, for at konne frem til samme resultat på mindre tid...
Synes godt om
Ny brugerNybegynder
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.