webForumDet fria alternativet

SQL-fråga

2 svar · 224 visningar · startad av MMats

MMatsMedlem sedan sep. 200061 inlägg
#1

Hejsan alla kungar på SQL-frågor !

Jag har en fint normaliserad databas med ett antal tabeller.
Problemet är att jag inte vet riktigt hur jag ska köra en sql-fråga för att få tag på allt data.

Jag har följande tabeller:

tblStaff
----------
fldStaffID      räknare (PK)
fldName         sträng
fldEMail        sträng
osv...

tblProject_staff (kopplingstabell many-to-many rel.)
----------
fldStaffID      integer (FK till tblStaff)
fldProjectID    integer (FK till tblProject)

tblProject
----------
fldProjectID    räknare (PK)
fldProjectName  sträng

tblResponibility_staff (kopplingstabell many-to-many rel.)
----------
fldStaffID      integer (FK till tblStaff)
fldRespID    integer (FK till tblResponsibilites)

tblResponsibilites
----------
fldRespID       räknare (PK)
fldRespArea     sträng

Vad jag vill göra är att visa en persons information som i det här fallet till större delen finns i tblStaff men även visa vilka
projekt han jobbar i och vilka ansvarsområden han har hand om.

Hade det varit bara tex ansvarsområdena jag ville visa och inte vilka projekt han arbetar i hade jag bara skrivit:

SELECT S.fldName, S.fldEMail, R.fldRespArea FROM ((tblResponsibility_staff AS RS
	INNER JOIN tblStaff AS S ON S.fldStaffID = RS.fldStaffID)
	INNER JOIN tblResponsibilities AS R ON R.fldRespID = RS.fldRespID)

Men nu har jag ju två kopplingstabeller och då vet jag inte riktigt hur jag ska gå till väga.

Är det någon som har något bra svar på detta?

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Det låter som om du vill hämta två stycken helt oberoende resultat och då verkar det naturligt att ställa två olika frågor.

SELECT S.fldName, S.fldEMail, R.fldRespArea FROM ((tblProject_staff AS PS 
INNER JOIN tblStaff AS S ON S.fldStaffID = PS.fldStaffID) 
INNER JOIN tblProject AS P ON P.fldprojectID = PS.fldProjectID)
SELECT S.fldName, S.fldEMail, P.fldProjectName FROM ((tblResponsibility_staff AS RS 
INNER JOIN tblStaff AS S ON S.fldStaffID = RS.fldStaffID) 
INNER JOIN tblResponsibilities AS R ON R.fldRespID = RS.fldRespID)

Eventuellt skulle du kunna lägga ihop deom i en union

SELECT S.fldName, S.fldEMail, R.fldRespArea,'Ansvar' as T FROM ((tblProject_staff AS PS 
INNER JOIN tblStaff AS S ON S.fldStaffID = PS.fldStaffID) 
INNER JOIN tblProject AS P ON P.fldprojectID = PS.fldProjectID) 
union all
SELECT S.fldName, S.fldEMail, P.fldProjectName,'Projekt' FROM ((tblResponsibility_staff AS RS 
INNER JOIN tblStaff AS S ON S.fldStaffID = RS.fldStaffID) 
INNER JOIN tblResponsibilities AS R ON R.fldRespID = RS.fldRespID) 
order by 4
MMatsMedlem sedan sep. 200061 inlägg
#3

Du har nog rätt i att jag måste göra flera frågor. Det hade ju varit trevligt om man kunnat kombinera dem så att det hade räckt med ett databasanrop. Men som sagt det är ju many-to-many förhållanden det gäller och då är det ju svårt att få ut ett endaste recordset på ett sådant anrop (det kan ju vara flera projekt en person jobbar i och då blir det ju svårt att få ut det i en varibel).

En fråga angående UNION:
När har man nytta av en sån egentligen? Har du något exempel?

161 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
157 ms — hämta tråd, inlägg och bilagor (db)