Avatar billede itognet Nybegynder
15. marts 2002 - 10:19 Der 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

Avatar billede proaccess Nybegynder
15. marts 2002 - 10:26 #1
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;
Avatar billede proaccess Nybegynder
15. marts 2002 - 10:26 #2
Rettelse:
SELECT Personale.* FROM Personale LEFT JOIN Personerivagt ON Personale.ID=Personerivagt.PersID WHERE Personerivagt.PersID Is Null;
Avatar billede itognet Nybegynder
15. marts 2002 - 10:37 #3
Jeg tror du har fat i noget der, men jeg forstår det ikke helt.

Når jeg vil lave en select ml. datoer gør jeg sådan her:

select * from vagtplan where dato >= '03-01-2002' AND dato <= '03-03-2002' order by DATO DESC

Jeg kan ikke rigtig se om jeg skal lave selecten på Personale tabellen eller på Vagtplan tabellen. ?
Avatar billede proaccess Nybegynder
15. marts 2002 - 10:46 #4
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!!!
Avatar billede itognet Nybegynder
15. marts 2002 - 11:04 #5
Okey. Jeg kan se ideen. Jeg har lavet denne sql linie:

select * from Personale Left Join Vagtplan ON Personale.Medarbejdernr=Vagtplan.Medarbejdernr where Personale.Medarbejdernr Is Null

Den returerer dog kun en linie med <null>'er

Jeg ikke se hvor jeg skal putte den første linie ind (mellem datoer) i
left join linien ?

Hvad mener du med at gemme en forspørgelse som 'personaleivagt' ?
Avatar billede proaccess Nybegynder
15. marts 2002 - 11:17 #6
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)
Avatar billede itognet Nybegynder
15. marts 2002 - 11:26 #7
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 ?!
Avatar billede proaccess Nybegynder
15. marts 2002 - 11:32 #8
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');
Avatar billede itognet Nybegynder
15. marts 2002 - 11:41 #9
Jeg tror det lykkesdes !!

1000 tak.

Har du nogen ide om hvordan man nedbriger tiden for denne selct linie. Den tager præcis 3 minutter !!
Avatar billede proaccess Nybegynder
15. marts 2002 - 11:47 #10
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...
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