johannalokeMedlem sedan apr. 200393 inlägg
Jag har problem med att skapa en sql-fråga med JOIN på 4 tabeller.
EFtersom jag är ganska ny på det här så reserverar jag mig kraftigt för
eventuella fel.
Det jag håller på att göra är ett dynamiskt organisationsschema i ASP och
Access-databas. En tabell med personer och en med avdelningar samt 2
tabeller för att avgöra vem som är förälder till vem.
Följande tabeller har jag:
tblPerson
persID - fornamn - efternamn
tblPersonParents
persID - parentID - typ
(typ hade jag tänkt mig bestämma om jag ska leta efter föräldern i
tblPerson eller tblAvdelning)
tblAvdelning
avdID - avdNamn
tblAvdParents
avdID - parentID - typ
Frågan är om jag kan skapa en sql-fråga som hämtar alla personer och
avdelningar, på samma gång, som har samma parentID (förälder) och typ?
//Johanna
johannalokeMedlem sedan apr. 200393 inlägg
Kan frågan skrivas så här?
Är det rätt att skriva frågan så här? Eller finns det något bättre sätt?
Jag gör väl en koppling mellan tabellerna när jag skriver så här?
valtID är förälderns ID alltså det som ska jämföras med parentID.
SQLfraga = "SELECT *
FROM tblPerson, tblPersonParents, tblAvdelning, tblAvdParents
WHERE tblPerson.persID=tblPersonParents.persID AND tblPersonParents.parentID= "& valtID &" AND tblAvdelning.avdID=tblAvdParents.avdID AND tblAvdParents.parentID= "& valtID &"
ORDER BY tblAvdelning.avdNamn, tblPerson.efternamn, tblPerson.fornamn"
//Johanna
johannalokeMedlem sedan apr. 200393 inlägg
Missade ta med typ i min fråga!
typID är en variabel som bestämmer av vilken typ föräldern är (avdelning eller person). Det ska jämföras med kolumnen typ i tblPersonParents och tblAvdParents.
SQLfraga = "SELECT *
FROM tblPerson, tblPersonParents, tblAvdelning, tblAvdParents
WHERE tblPerson.persID=tblPersonParents.persID
AND tblPersonParents.parentID= "& valtID &"
AND tblAvdelning.avdID=tblAvdParents.avdID
AND tblAvdParents.parentID= "& valtID &" AND tblPersonParents.typ= "& typID &"
AND tblAvdParents.typ= "& typID &"
ORDER BY tblAvdelning.avdNamn, tblPerson.efternamn, tblPerson.fornamn"
Lyckas jag egentligen förklara så någon förstår :q
//Johanna
Engine^Medlem sedan dec. 20002 861 inlägg
strSQL = "SELECT efternamn, fornamn, avdNamn " & _
"FROM tblPerson tP " & _
"INNER JOIN (tblPersonParents tPP " & _
" INNER JOIN (tblAvdParents tAP " & _
" INNER JOIN tblAvdelning tA " & _
" ON tA.avdID = tAP.avdID) " & _
" ON (tAP.parentID = tPP.parentID) AND (tAP.typID = tPP.typID)) " & _
"ON tPP.persID = tP.persID " & _
"WHERE tPP.typID = " & typID & " AND tPP.parentID = " & valtID " & _
"ORDER BY avdNamn, efternamn, fornamn"
Säkert någon parantes som kommit på villovägar nu, men det är ju som sig bör ;)
LarsGMedlem sedan dec. 200012 465 inlägg
Jag förstår inte riktigt din datamodell. Speciellt är det
tblPersonParents och tblAvdParents som jag inte får grepp om.
Att ha en kolumn för att avgöra i vilken tabell något finns brukar aldrig fungera bra.
Vad är det du vill beskriva?
johannalokeMedlem sedan apr. 200393 inlägg
Tack Engine!
Lite fler frågor bara...
I FROM-satsen har du valt tblPerson spelar det någon roll vilken tabell jag sätter där? Kan jag lika gärna ha tblAvdelning och med då lite ändringar i INNER JOIN och WHERE-satsen? Eller är det viktigt vilken ordning de kommer? Varför i så fall?
Så som du skrivit frågan är det ett bättre sätt än med massa AND i WHERE-satsen som jag gjort? Kan inte sql så bra så jag vet inte riktigt skillnaden. Vad är skillnaderna egentligen? Är det bara lättare att förstå eller får jag andra svar eller går det snabbare osv?
//Johanna
johannalokeMedlem sedan apr. 200393 inlägg
Hej LarsG!
Ska försöka förklara bättre. Vet knappt själv hur jag vill ha det ;-)
De här parenttabellerna ska hålla reda på vem som är förälder åt dem. Jag ska rita ett organisationsschema och måste veta vem som ligger över osv.
Eftersom en person både kan ha en avdelning eller en annan person över sig måste jag veta vilken typ föräldern är.
Detta för att jag har en tabell med avdelningar och en personer. Jag måste ju veta i vilken av tabellerna jag ska leta efter föräldern i. För som det är nu så kan ett visst valtID vara både ett persID eller ett avdID.
Jag är lite inne på att ha allting i samma tabell eftersom jag har nästan samma kolumner (skulle kunna justeras till lite). Då slipper jag hålla reda på vilken typ föräldern är av. För då skulle id vara helt unikt, alltså ett persID och ett avdID skulle inte kunna vara samma.
Vet inte vilket som är smartast och lättast?
//Johanna
johannalokeMedlem sedan apr. 200393 inlägg
Fler frågor Engine!
Det är så att jag behöver inte få några "träffar" i tblPerson men kanske får det i tblAvdelning. Eller tvärtom.
Fungerar din fråga i bägge fallen?
//frågvisa Johanna
Engine^Medlem sedan dec. 20002 861 inlägg
Nej. En INNER JOIN returnerar bara poster för vilka villkoret uppfylls av båda tabellerna. Däremot går det bra att använda LEFT eller RIGHT OUTER JOIN.
strSQL = "SELECT efternamn, fornamn, avdNamn " & _
"FROM tblPerson tP " & _
"RIGHT OUTER JOIN (tblPersonParents tPP " & _
" INNER JOIN (tblAvdParents tAP " & _
" LEFT OUTER JOIN tblAvdelning tA " & _
" ON tA.avdID = tAP.avdID) " & _
" ON (tAP.parentID = tPP.parentID) AND (tAP.typID = tPP.typID)) " & _
"ON tPP.persID = tP.persID " & _
"WHERE tPP.typID = " & typID & " AND tPP.parentID = " & valtID " & _
"ORDER BY avdNamn, efternamn, fornamn"
Huruvida det här fungerar som du vill vet jag inte riktigt, men det är ju bara att återkomma :)
m_soderlundMedlem sedan sep. 20024 733 inlägg
LarsGMedlem sedan dec. 200012 465 inlägg
aasahMedlem sedan mars 20033 451 inlägg
johannaloke skrev:
... De här parenttabellerna ska hålla reda på vem som är förälder åt dem. Jag ska rita ett organisationsschema och måste veta vem som ligger över osv.
Eftersom en person både kan ha en avdelning eller en annan person över sig måste jag veta vilken typ föräldern är....
??? :q Va? Alltså, vad har vi egentligen? Vi har avdelningar och personer. Menar du något i stil med följande:
En person arbetar på en/flera avdelning(ar). På en avdelning arbetar flera personer. En viss person kan ha en annan som chef, en viss avdelning kan ha en annan avdelning omedelbart över sig. Kan en person ha en avdelning över sig? Eller är min beskrivning fullständigt felaktig? Det vore bra med svar för att fatta hur din struktur ser ut. :) Vilket är första steget för att kunna svara på om det kan skrivas bättre.
johannalokeMedlem sedan apr. 200393 inlägg
Hej aasah!
Förlåt har inte sett ditt inlägg.
Jag har löst frågan nu men tack ändå!
//Johanna