06. november 2006 - 13:03Der er
5 kommentarer og 1 løsning
Problem med multiple inner joins
Hejsa,
Jeg sidder med et underligt problem.. Jeg er ved at lave et lille bitte bookingsystem til noget fitness halløj, men jeg er rendt ind i et problem. Jeg vil udskrive dagens hold fra tabellen "classes". I tabellen "classes" er følgende felter: classID, hallID, teamTypeID, classDay & instructor.
classID er autonummeret og primær nøgle i "classes"
hallID relaterer til tabellen "halls" og feltet hallID, da ét træningscenter godt kan have flere sale. I "halls" er også feltet hallName.
teamTypeID relaterer til tabellen "teamtypes" og feltet "teamTypeID". I tabellen er også feltet teamTypeName.
classDay er et tal, da det er de samme hold hver uge. I dette tilfælde er det = 2
instructor relaterer til "users" og feltet userID, da instruktør bare er en alm bruger med brugertypen "instruktør". I "users" er også feltet name.
Det jeg forsøger er at udskrive tidspunktet for holdet, samt navnet på salen, instruktøren og holdnavnet.
Jeg har forsøgt at strikke nogle forskellige SQL sætninger sammen, men den fejler altid.
Den her:
SELECT c.classID, c.capacity, c.fromHour, c.fromMinute, c.toHour, c.toMinute, u.name, t.teamTypeName, h.hallName FROM classes c INNER JOIN (teamtypes t INNER JOIN (halls h INNER JOIN (users u ON c.instructor=u.userID) ON c.hallID=h.hallID) ON c.teamTypeID=t.teamTypeID WHERE classDay = 2 ORDER BY fromHour, toHour
Giver Microsoft OLE DB Provider for ODBC Drivers fejl '80040e14'
[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i JOIN-handlingen.
Den her (som ikke engang har alle relationer skrevet ind):
SELECT c.classID, c.capacity, c.fromHour, c.fromMinute, c.toHour, c.toMinute, t.teamTypeName, u.name FROM classes c INNER JOIN teamtypes t ON c.teamTypeID=t.teamTypeID INNER JOIN users u ON c.instructor=u.userID WHERE c.classDay = 2
Giver: Microsoft OLE DB Provider for ODBC Drivers fejl '80040e14'
[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "c.teamTypeID=t.teamTypeID INNER JOIN users u ON c.instructor=u.userID".
Er der nogen der kan hjælpe mig? Den eneste forbindelse tabellerne "users", "teamtypes" og "halls" har med hinanden, er i "classes" - ellers har de intet der kan binde dem sammen.. :(
SELECT c.classID, c.capacity, c.fromHour, c.fromMinute, c.toHour, c.toMinute, t.teamTypeName, u.name FROM (classes c INNER JOIN teamtypes t ON c.teamTypeID=t.teamTypeID) INNER JOIN users u ON c.instructor=u.userID WHERE c.classDay = 2
Så spiller det sgu.. Det var jo hurtigt klaret! haha.. og den SQL har jeg siddet og stirret på hele weekenden.. Skide godt. :-D
Nu hvor jeg alligevel har dig, så har "classes" også et felt der hedder capacity, hvor man kan definere hvor mange mennesker der kan være på holdet. KAN man når det er en Access database, lave sådan en Case i SQL'en så man får udskrevet enten 1, 2 eller 3 afhængig af hvor mange der er tilmeldt? Det kræver jo i øvrigt så at man tjekker "booking" tabellen og matcher på den pågældende dato og tæller op, hvorefter man så sammenligneder antallet af bookninger på dét hold med "capacity" og derefter udskriver 1 - for ledige pladser, 2 - for få ledige pladser eller 3 - for fuldt booket.
Det lyder måske lidt overkill, og min umiddelbare løsning ville være at tjekke på det i min nuværende Do While Not rs.EOF, men HVIS det kunne lade sig gøre, så ville det jo være lidt bedre for ydeevnen, right?
Jeg ved ikke umiddelbart om du kan lave sådan en case - i så fald skulle det nok være en indbygget funktion (noget a la Choose i VB), som tillod dig at returnere en værdi fra en liste, på grundlag af et databasefelt. Jeg tvivler stærkt på, at Access kan håndtere andet end SQL-sætninger og indbyggede funktioner (modsat Stored Procedures i f.eks. SQL Server).
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.