Avatar billede mahyar Nybegynder
24. februar 2006 - 17:19 Der er 7 kommentarer og
1 løsning

SQL problem med fællesmængde

Tabeller: Tid, Reservation

Reservation indeholder: reservationId, produktId, tidId, navn, tlf, email, dato


Tid indeholder: tidId, tidspunkt


Problem:

når jeg vælger en dato fra tabellen Reservation skal den returnere alle de ledige tider fra tabellen Tid. Da hver reservation har en dato og en tidId tilknyttet, vil jeg tro der skal bruges en eller anden join. jeg bruger selv den nedenstående sql, men får de tidspunkter der er reserveret allerede. Jeg vil have de ledige tidspunkter udfra den valgte dato.

"SELECT Tid.tidId, Tid.tidspunkt " +
            "FROM Tid INNER JOIN Reservation ON Reservation.tidId=Tid.tidId " +
            "WHERE Reservation.dato=[@dato] AND NOT ISNULL( Reservation.tidId) "
Avatar billede kalp Novice
24. februar 2006 - 18:55 #1
hvordan ved man om der er ledigt eller ej? ved at reservation.tidId er tom hvis der er ledigt?
hvis ja hvilken datatype er feltet tidid?
Avatar billede mahyar Nybegynder
24. februar 2006 - 20:54 #2
på tabellen Reservation har jeg en felt der hedder "dato" og en felt med "tidId". "tidId" er den valgte tidId fra tabellen Tid. Dvs på en reservation vil vi få et tidId og en dato. Sådan som tabellen Reservation er opbygget vil en dato på en reservation kunne indeholde forskellige tidpunkter. Det skal dog ikke være mulig at kunne vælge samme dato med samme tidspunkter.
Derfor når jeg vælger en dato fra tabellen Reservation, skal alle de tidId'er, der allerede hænger på datoen ikke returneres.
tidId har datatypen (tal)Integer.
Avatar billede nih Novice
24. februar 2006 - 22:41 #3
"SELECT Tid.tidId, Tid.tidspunkt " +
"FROM Tid Left JOIN Reservation ON Reservation.tidId=Tid.tidId " +
"WHERE Reservation.dato=[@dato] AND ISNULL( Reservation.tidId) "

prøv at lege med hhv left og right join

Niels
Avatar billede _darkstar_ Nybegynder
25. februar 2006 - 00:49 #4
Hvis din database understøtter subselects, er det sådan en konstruktion, du skal bruge:

SELECT * FROM Tid WHERE tidId NOT IN (SELECT Reservation.tidId FROM Reservation)
Avatar billede mahyar Nybegynder
25. februar 2006 - 17:16 #5
hej Niles
jeg prøvede din løsning men det hjalp ikke. For jeg får ikke de ledige tider frem. Jeg får ingen resultater ud af det. men når jeg skriver "NOT ISNULL" får jeg de tidId'er der både er i tabellen Reservation og Tid


Hej darkstar

Jeg bruger en access database, jeg prøvede dit eksampel og jeg får også de tidId'er som er i Tid tabellen men ikke i Reservation tabellen. så hertil er det ok. Men det skal kunne finde dem ud fra det valgte date. Og når jeg giver  "AND Reservation.dato=@dato" får jeg en fejl i koden der siger at "Der er ikke angivet værdi for en eller flere af de krævede parametre" selvom "@dato" får en værdi.
Avatar billede _darkstar_ Nybegynder
25. februar 2006 - 19:48 #6
SELECT *
FROM Tid
WHERE tidId NOT IN (
    SELECT Reservation.tidId
    FROM Reservation
    WHERE Reservation.dato=@mindato
)

Jeg er ikke klar over hvordan @-konstruktionen virker i Access, men der kan godt være et problem hvis du både har et parameter (@dato) og et felt (dato), som hedder det samme, så prøv det jeg har skrevet ovenfor.
Avatar billede nih Novice
25. februar 2006 - 23:11 #7
Jeg har en gang testet performance på de to løsningsmodeller.

uden at kunne huske resultatet helt præcist, viste det sig at indlejrede select sætninger blev utroligt langsomme når tabellerne voksede i størrelse.

Niels
Avatar billede mahyar Nybegynder
26. februar 2006 - 18:51 #8
Hej Niels

Det er meget muligt at de bliver langsommere når DB'en vokser. Men lige i første omgang skal det bare fungere, også skal jeg se om jeg kan finde en anden løsning til det. Men ellers tak for dine svarer.
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