probleem met query

Status
Niet open voor verdere reacties.

shidan

Gebruiker
Lid geworden
8 jan 2007
Berichten
354
goedemiddag,
wie kan mij helpen met een query?

ik heb een databank met drie tabellen (kinderen, sport activiteiten)
een kind kan een sport doen op een bepaald activiteitenniveau (1 tot 5), of ook geen sport doen.

ik wens een lijst waarin alle kinderen éénmaal voorkomen met een sport op niveau 3, 4 of 5

als een kind bvb twee sporten doet op dat nivieau wil ik er slechts één zien
ook een kind dat geen sport doet, wil ik zien in de lijst

in bijlage de databank,

met dank bij voorbaar

Bekijk bijlage sporten.zip
 
Je wilt er één zien, zeg je. Maar welke?
 
hallo,

dat is eender.
iemand die een sport doet op dit niveau kan subsidie krijgen.
maar wel voor één sport, niet voor meerdere.
het maakt dus niet uit welke sport het is
 
Niet in jouw voorbeeld waar Pieters Jan 2 sporten heeft (voetbal op 2 en tennis op 4) en De Haen Mieke die zelfs 3 sporten heeft! En dan moet je niet gek staan te kijken als ik vraag welke je wilt zien.
 
hallo
indien mogelijk dan de sporten in volgorde van activiteit_id (tbl_activiteiten)
dus bij pieters jan (voetbal), De Haen Mieke (Zwemmen)

het enige wat ik wens te zien is of iemand een sport doet op niveau 3, 4 of 5 en dan de naam van een sport erbij
doet deze persoon nu één of meerdere sporten of niveau 3, 4 of 5, de subsidie blijft gelijk.

ik wil echter wel ALLE kinderen zien in de query
bvb
Pieters Jan Tennis
De Haen Mieke Zwemmen
De Smet Jordi Voetbal
Crul Yvan nihil
De Smet Jonas nihil
Michiels stefaan nihil
 
ik heb al een deel van de query gemaakt.
nu zie ik alle personen en een niveau (2,3 of 4)
bij deze query wil ik na een niveau zien welke sport het is, indien geen sport graag 'nihil'
dat krijg ik er gewoon niet bij

Code:
SELECT k.naam, niveau.s_aid
FROM 
			t_kinderen AS k 
	
	LEFT JOIN (
		
		SELECT s.kind_id AS s_kid, 
				
		Min(s.activiteit_id) AS s_aid 
			
		FROM t_sport AS s
			
		WHERE (((s.activiteit_id) In (2,3,4))) 
				
		GROUP BY s.kind_id
				
		)  AS niveau 
		
	ON niveau.s_kid = k.kind_id;
 
Ik doe het hier mee.
Code:
SELECT t_kinderen.kind_id, t_kinderen.naam, t_activiteit.naam, t_sport.sportNiveau
FROM t_kinderen INNER JOIN (t_activiteit INNER JOIN t_sport ON t_activiteit.activiteit_id = t_sport.activiteit_id) ON t_kinderen.kind_id = t_sport.kind_id
WHERE (((t_sport.sportNiveau) In (select max(t1.[sportNiveau]) from t_sport as t1 where t1.kind_id= t_sport.[kind_id] ) And (t_sport.sportNiveau)>="3"));
 
hartelijke bedankt,

dit is ongeveer wat ik wilde.
wat ik nu nog mis zijn de kinderen erbij die geen sport doen of deze op een ander niveau
(dan met het met "nihil" ernaast zijn)

is dat mogelijk?
 
Dan moet je van de query een Outer Join maken.
Code:
SELECT t_kinderen.kind_id, t_kinderen.naam, t_activiteit.naam, t_sport.sportNiveau
FROM t_kinderen LEFT JOIN (t_activiteit RIGHT JOIN t_sport ON t_activiteit.activiteit_id = t_sport.activiteit_id) ON t_kinderen.kind_id = t_sport.kind_id
WHERE (((t_sport.sportNiveau) In (select max(t1.[sportNiveau]) 
FROM t_sport as t1 where t1.kind_id= t_sport.[kind_id] ) And (t_sport.sportNiveau)>="3" Or (t_sport.sportNiveau) Is Null));
 
goedemorgen,

blijkbaar heb ik de opdracht iets verkeerd begrepen.
ik zou alle kinderen moeten zien en op welk niveau zijn voetballen of zwemmen
(dus elk kind, EN als ze voetballen of zwemmen, op welk niveau dit is)

mijn excuses voor het ongemak.
is dit aan te passen?
 
Volgens mij doet de Outer Join dat: die laat alle kinderen zien, en van de sporten de hoogste waarde.
 
als ik dat probeer krijg ik een popup
"De component FROM bevat een syntaxfout"
??
 
Ik heb het nog weer eens uitgetest en je voorbeeldje opnieuw gedownload en daar de query in gemaakt. Werkt tadellos!
 
Dat staat inderdaad in de code in bericht #9. Die heb je neem ik aan toch wel in je eigen db geplakt? Want waar praten we anders over?
 
als ik onderstaande query laat lopen krijg ik de fout
kent acces een OUTER JOIN? of moet ik een andere naam geven?

Code:
SELECT t_kinderen.kind_id, t_kinderen.naam, t_activiteit.naam, t_sport.sportNiveau
FROM t_kinderen OUTER JOIN (t_activiteit RIGHT JOIN t_sport ON t_activiteit.activiteit_id = t_sport.activiteit_id) ON t_kinderen.kind_id = t_sport.kind_id
WHERE (((t_sport.sportNiveau) In (select max(t1.[sportNiveau]) 
FROM t_sport as t1 where t1.kind_id= t_sport.[kind_id] ) And (t_sport.sportNiveau)>="3" Or (t_sport.sportNiveau) Is Null));
 
Nogmaals: heb je mijn query code al getest? Want die doet precies wat je vraagt. En nee, Access kent geen Outer Join. Dat is het verzamelbegrip voor LEFT JOIN en RIGHT JOIN.
 
ja, ik heb jouw code in de query gestopt
deze bedoel je toch he?
doet niet echt wat zou moeten.
enkel als ze voetballen of zwemmen wil ik het niveau zien,
anders gewoon de naam met 'nihil' ernaast

Code:
SELECT t_kinderen.kind_id, t_kinderen.naam, t_activiteit.naam, t_sport.sportNiveau
FROM t_kinderen LEFT JOIN (t_activiteit RIGHT JOIN t_sport ON t_activiteit.activiteit_id = t_sport.activiteit_id) ON t_kinderen.kind_id = t_sport.kind_id
WHERE (((t_sport.sportNiveau) In (select max(t1.[sportNiveau]) 
FROM t_sport as t1 where t1.kind_id= t_sport.[kind_id] ) And (t_sport.sportNiveau)>="3")) OR (((t_sport.sportNiveau) Is Null));
 
Nu wil je weer filteren op zwemmen of voetballen? Niet meer op niveau >=3? Dat is een heel andere query... Ik ga er even vanuit dat je dit niet wilt, want anders blijf je bezig ;) De aanpassing op mijn oorspronkelijke query (die bijna doet wat je wilt, behalve 'nihil' erbij zetten is dan:
Code:
SELECT t_kinderen.kind_id, t_kinderen.naam AS [naam kind], IIf([t_activiteit]![naam] Is Null,"nihil",[t_activiteit]![naam]) AS Activiteit, t_sport.sportNiveau
FROM t_kinderen LEFT JOIN (t_activiteit RIGHT JOIN t_sport ON t_activiteit.activiteit_id = t_sport.activiteit_id) ON t_kinderen.kind_id = t_sport.kind_id
WHERE (((t_sport.sportNiveau) In (select max(t1.[sportNiveau]) FROM t_sport as t1 where t1.kind_id= t_sport.[kind_id] ) 
And (t_sport.sportNiveau)>="3")) OR (((t_sport.sportNiveau) Is Null));
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan