Avatar billede lasse_hyldal Nybegynder
09. maj 2002 - 22:31 Der er 10 kommentarer og
1 løsning

Access SQL

Jeg har følgen tabel struktur:

Lokale:LokaleID  //PN(primær nøgle)
      Kapacitet
      LokaleTypeID//FN (fremmed nøgle)
      BygningsBegnelse
      AntalOH
      AntalPC
      AntalWB

LokaleType:LokaleTypeID//PN
          LokaleType //beskrivelse af lokalet etc. Forhal

Reservation:ReservationsID//PN
            LokaleID//FN
            StartTid
            SlutTid

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.
Avatar billede whatever Nybegynder
09. maj 2002 - 22:34 #1
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
Avatar billede terry Ekspert
10. maj 2002 - 09:17 #2
take a look at this question
http://www.eksperten.dk/spm/207898
there are other who have EXACTLY the same problem
Avatar billede terry Ekspert
10. maj 2002 - 09:17 #3
Avatar billede proaccess Nybegynder
10. maj 2002 - 11:02 #4
>whatever: hvad er det for noget pjat... ;0)

SELECT K.Navn, P.Bynavn FROM Kunder AS K INNER JOIN Postnumre AS P ON K.Postnummer=P.Postnummer;

SELECT K.Navn, (SELECT Bynavn FROM Postnumre WHERE Postnummer=K.Postnummer) AS Bynavn FROM Kunder AS K;

SELECT K.Navn, P.Bynavn FROM Kunder AS K, (SELECT Postnummer, Bynavn FROM Postnumre) AS P WHERE K.Postnummer=P.Postnummer;

Er alle gyldig Access-SQL fra og med version 2000 !!!
Avatar billede lasse_hyldal Nybegynder
10. maj 2002 - 11:07 #5
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.
Avatar billede proaccess Nybegynder
10. maj 2002 - 11:20 #6
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...
Avatar billede ferdinand.k Mester
10. maj 2002 - 11:45 #7
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!
Avatar billede proaccess Nybegynder
10. maj 2002 - 13:19 #8
>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...
Avatar billede ferdinand.k Mester
10. maj 2002 - 14:16 #9
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.

Dette er hvad jeg spørger til:

FROM LokaleType, Lokale, Reservation

SELECT DISTINCT LokaleType.LokaleType, Lokale.LokaleID, Lokale.Kapacitet, Lokale.BygningsBetegnelse

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));
Avatar billede lasse_hyldal Nybegynder
10. maj 2002 - 16:05 #10
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]+"*"));
Avatar billede proaccess Nybegynder
11. maj 2002 - 07:35 #11
Med eet tidspunkt at spørge på, så virker denne:

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);
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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