07. september 2002 - 11:25Der er
17 kommentarer og 2 løsninger
Masser af tabeller og joins...kan det gøres smartere?
Hejsa!
Jeg sidder og er ved at lave en adresseliste for diverse udvalg m.m.
1 person kan være medlem af flere udvalg og udvalgene kan skifte struktur. Samtidig skal der være en del søge og redigeringsmuligheder, så DB'en skal være rimelig fleksibel.
Jeg har indtil videre lavet følgende tabeller med felter i parantes:
Personer, (Id, fornavn, efternavn...) Indeholder navne og adresser på personer
Funktion, (Id, Titel) Indeholder titler. Eksempelvis Direktør, økonomiansvarlig, næstformand etc.
Udvalg, (Id,udvalg) Indeholder navnene på udvalgene, ex. hovedbestyrelse, ungdomsafdeling etc.
listen, (udvalg, funktion1, navn1, funktion2, navn2...) Her har jeg så forsøgt at samle det hele forstået på den måde, at jeg ved hjælp af ID'erne i de andre tabeller får bygget adresselisten op. Først hvilket udvalg, så hvilken funktion og hvem der har den funktion.
Jeg har lavet relationer mellem de enkelte felter i "listen" og så over til Id-feltet i de andre tabeller.
Jeg har blot lidt svært ved at få lavet de rigtige SQL'er.
Måske er DB'en ikke bygget optimalt op og så hører jeg meget gerne alternativer
Jeg har lavet følgende SQL: sql3 = "SELECT * FROM listen INNER JOIN funktion ON listen.funktion1 = funktion.id WHERE udvalg="&udvalgid
hvor udvalgid er en variabel, der bliver valgt i en FORM.
Men skal hvordan får jeg joinet navnene i samme SQL og skal der laves en join for hver funktion (funktion1, funktion2, funktion3 etc) samt for hvert navn (navn1, navn2 etc.) for at kunne liste et udvalg med titel og navne?
Håber der er nogen hajer, der kan hjælpe - på forhånd tak!
I dette særtema ser vi på, hvordan cloud og AI bliver fundamentet for virksomhedernes digitale forretning, og hvordan de nye muligheder for automatisering og forretningsværdi kan udnyttes uden at miste overblik, sikkerhed og menneskelig kontrol.
listen skal laves om til.... id, udvalg, funktion, person hvor.... listen.Id (Int, index, unique, autoincrement) listen.udvalg (Int, Not null) relation til udvalg.Id listen.funktion (Int, Not null) relation til funktion.Id listen.person (Int, Not null) relation til person.Id
Så vil din query se sådan ud...... SQL3 = "SELECT * FROM listen, udvalg, funktion, personer WHERE listen.person = person.Id AND listen.funktion = funktion.Id AND listen.udvalg = '"& udvalgid &"'"
Den vælger så alle personer i det angivede udvalg, og viser deres personlige oplysninger og funktioner...
tabellen 'listen' er aldeles ikke overflødig...! hvad hvis en person har flere funktioner i forskellige udvalg. Så skal personen oprettes flere gange i 'personer'......!
Selvfølgelig skal han bruge 'listen'
Det er en ganske fornuftig opsætning, men i tabellen 'listen' skal der ikke være mulighed for flere funktioner (funktion1, navn1, funktion2, navn2) pr post, men derimod mange poster på en funktioner, personer og udvalg, men så kan en person bare have flere poster, hvis han har en eller flere funktioner i et eller samme udvalg.....!
Misbruger: Kravene du har opstillet til de enkelte felter (listen.id, listen.person etc) synes jeg ikke helt jeg kan finde. Jeg benytter Access 2000 :-S.....
Hej igen! Jeg får følgende fejlmeddelse: ---- Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2. ----
Jeg har ikke kunne finde alle de krav du (misbruger) opstiller til variablene (så godt er jeg desværre heller ikke inde i Access)
Mht. relationerne skal der så være "Enforce referential integrity"? Hvis ja, så får jeg problem med, at felterne der relateres mellem ikke er samme datatype.
Prøv at lave det offline i Access først. Undgå "Enforce referential integrity". Du kan fortælle query-builderen om relationerne ved at trække forbindelser mellem felterne, når bygger din query.
-> Neteffect. Jeg får en "Datatypen stemmer ikke overens i kriterieudtrykket. Jeg synes alle de involverede felter er "Long integer"....hvad gør jeg galt?
Jeg pusler direkte med SQL. Queryen er den "misbrug" præsenterede lidt længere oppe:
SQL3 = "SELECT * FROM listen, udvalg, funktion, personer WHERE listen.person = personer.Id AND listen.funktion = funktion.Id AND listen.udvalg = '"& udvalgid &"'"
Ja, irriterende, at det for det meste (læs:altid) er gutten der sidder 40 cm fra skærmen, der må erkende fejlen ;-)
SQL3 = "SELECT * FROM listen, udvalg, funktion, personer WHERE listen.person = personer.Id AND listen.funktion = funktion.Id AND listen.udvalg = " & udvalgid
Der skal ikke ' om udvalgid
Jeg tror vi er på vej hen imod:
SQL4 = "SELECT personer.fornavn, personer.efternavn, funktion.titel, udvalg.udvalg FROM (((listen INNER JOIN personer ON listen.person=person.id) INNER JOIN udvalg ON udvalg.id=listen.udvalg) INNER JOIN funktion ON funktion.id=listen.funktion)"
Men som tidligere nævnt, lav det først i Access og snup SQL'en derfra.
Jeg har fordelt pointene imellem jer og håber I begge er tilfredse.
Det hele virker nu, men jeg er ret sikker på, at der kan komme spørgsmål i forbindelse med sql'er i forbindelse med udvælgelse af data, men den tid den sorg ;-)
Under alle omstændigheder - mange tak for hjælpen!!!
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.