Jeg vil gerne udskrive en sql forespørgsel der returnere en tabel med ledige lokaler der opfylder nogle krav, så som etc. en minimums kapacitet, en bestemt LokaleType og datoer og tidspunkter hvor lokalerne (der opfylder kravene) er ledige.
Mit problem tror jeg er når jeg skal skal igennem flere tabeller for derved at opfylde mine krav i WHERE sætningen.
Kan jeg ikke få nogle eksempler på hvorledes det virker. Og få fortalt hvornår man evt. bruger flere SELECT sætninger i samme forspørgsel.
I access kan du ikke have SELECT-sætninger i samme forespørgsel. Istedet kan du jo joine dine tabeller, så du kan hente data ud af flere tabeller i en forespørgsel. Du kan se mere om SQL på www.w3schools.com
Det mente jeg nemlig også sagtens man kunne. Men er det ved hjælp af dette vi skal løse vores problem med at have krav i vores WHERE-sætning fra flere forskellige tabeller.
Du skal samle dine tabeller i een forespørgsel, som du så kan sætte WHERE på... Dit problem er bare at du registrerer reserveret tid og ikke ledig tid, derved skal du pludselig UNDLADE information i stedet for at UDVÆLGE samme...
BUT ANYWAY, måden du skal bruge er følgende:
SELECT LT.*, L.* FROM Lokaletype AS LT, Lokale AS L WHERE LT.LokaleTypeID=L.LokaleTypeID AND (SELECT Count(ReservationsID) AS RES FROM Reservation WHERE LokaleID=L.LokaleID AND [Indtast tidspunkt:] BETWEEN StartTid AND SlutTid)=0;
Derved har du "samlet" lokaletypeinfo og lokaleinfo, og fået antallet af reservationer for det pågældende lokale (Som altså skal være 0, for at lokalet er ledigt)...
[Indtast tidspunkt] er en parameter, som skal indtastes...
den fungere ok, men hvordan kan må på den måde få udskrevet de lokaler som SLET ikke har nogen reservationer? På denne måde sorterer vi jo kun i de reservationer, der er!
>ferdinand.k: Det jeg gør i mit eksempel, er rent faktisk at lave et opslag for ALLE lokaler, der optæller antallet af reservationer på det pågældende tidsrum... Hvis der slet ingen er, så returneres 0, og det er i og for sig det optimale resultat, da det er det vi skal bruge...
Det er et ekstra SQL-SELECT for hver record i lokale-tabellen og altså IKKE et join, som du nok (med rette) er bange for...
det er nok det! :) men hvordan kan man så lave det så den også tager sluttiden med? Nu går den jo kun ind og undersøger om det tidspunkt man indtaster ligger imellem de to tidspunkter.
WHERE (((LokaleType.LokaleTypeID)=[Lokale].[LokaleTypeID]) AND (((SELECT Count(ReservationsID) AS RES FROM Reservation WHERE LokaleID=Lokale.LokaleID AND [Indtast tidspunkt:] BETWEEN Start AND Slut))=0));
nu får vi den til at udskrive de rigtige lokaler, hvis de indtastede start og slut forefindes i reservations tabellen. Den skriver derimod ingen lokaler ud, hvis de indtastede start og slut ikke forefindes i Reservations-tabellen. Her skulle den jo ellers udskrive de lokaler, som matchede de andre krav. Den vil med andre ord ikke, hvis den ikke kan genkende nogle Start og Slut fra Reservationstabellen overhovedet. Her er koden:
SELECT DISTINCT LokaleType.LokaleType, Lokale.LokaleID, Lokale.BygningsBetegnelse, Lokale.Kapacitet, LokaleType.LokaleType FROM LokaleType, Lokale, Reservation WHERE (((LokaleType.LokaleTypeID)=[Lokale].[LokaleTypeID]) AND (((SELECT Count(ReservationsID) AS RES FROM Reservation WHERE LokaleID=Lokale.LokaleID AND
[Indtast starttid:] BETWEEN Start AND Slut))=0) AND (([indtast sluttid]) Between [start] And [slut]) AND ((Lokale.Kapacitet) Between [Indtast Minimum Kapacitet] And [Indtast Maksimum Kapacitet]) AND ((LokaleType.LokaleType) Like "*"+[Indtast Lokale type]+"*"));
SELECT LokaleType.LokaleType, Lokale.LokaleID, Lokale.BygningsBetegnelse, Lokale.Kapacitet FROM LokaleType INNER JOIN Lokale ON LokaleType.LokaleTypeID = Lokale.LokaleTypeID WHERE LokaleType.LokaleType Like "*" & [Indtast lokaletype:] & "*" AND Lokale.Kapacitet Between [Indtast Minimumskapacitet:] And [Indtast maksimumskapacitet:] AND (SELECT Count(*) FROM Reservation WHERE LokaleID=Lokale.LokaleID AND [Indtast Tidspunkt:] Between [StartTid] And [SlutTid])=0;
Hvis I(?) derimod skal bruge både start og sluttidspunkter, så skal der checkkes for: Starttid i interval af reservationer (Som vi gør nu) Sluttid i interval af reservationer (som vi gør nu, bare med anden dato indtastet) Er der nogen reservationer, som ligger "gemt" inde mellem vores indtastede start og sluttider (omvendt af hvad vi gør nu) Og så vil forespørgslen se sådan ud:
SELECT LokaleType.LokaleType, Lokale.LokaleID, Lokale.BygningsBetegnelse, Lokale.Kapacitet FROM LokaleType INNER JOIN Lokale ON LokaleType.LokaleTypeID = Lokale.LokaleTypeID WHERE (LokaleType.LokaleType Like "*" & [Indtast lokaletype:] & "*") AND (Lokale.Kapacitet Between [Indtast Minimumskapacitet:] And [Indtast maksimumskapacitet:]) AND ((SELECT Count(*) FROM Reservation WHERE LokaleID=Lokale.LokaleID AND [Indtast Start tidspunkt:] Between [StartTid] And [SlutTid])=0) AND ((SELECT Count(*) FROM Reservation WHERE LokaleID=Lokale.LokaleID AND [Indtast slut tidspunkt:] Between [StartTid] And [SlutTid])=0) AND ((SELECT Count(*) FROM Reservation WHERE LokaleID=Lokale.LokaleID AND StartTid Between [Indtast start tidspunkt:] And [Indtast slut tidspunkt:])=0);
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.