Avatar billede donkazz Nybegynder
06. november 2006 - 13:03 Der 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.. :(
Avatar billede softspot Forsker
06. november 2006 - 13:08 #1
Prøv at smide en parantes omkring dine joins:

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
Avatar billede donkazz Nybegynder
06. november 2006 - 13:10 #2
hmmm.. det virkede.... haha... jeg prøver lige at bygge resten af tabellerne ind, og så vender jeg lige tilbage.. Tak for hjælpen indtil videre..
Avatar billede donkazz Nybegynder
06. november 2006 - 13:17 #3
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?

Smid lige et svar så du kan få dine point. :)
Avatar billede softspot Forsker
06. november 2006 - 13:27 #4
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).
Avatar billede donkazz Nybegynder
06. november 2006 - 13:35 #5
Okay cool.. Så må jeg lave en ny SELECT i løkken der tjekker op på status osv. indtil jeg får smidt systemet over på en SQL server.

Tak for hjælpen.
Avatar billede softspot Forsker
06. november 2006 - 13:38 #6
Velbekomme - og tak for point :)
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
Kurser inden for grundlæggende programmering

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