deze query geeft te veel records.

Status
Niet open voor verdere reacties.
Je begint een beetje door te draaien met die subqueries :).
PHP:
SELECT naam, depnr, loon FROM werkn WHERE loon>3700;
 
Ja, ik weet wel dat het zo eenvoudiger kan, maar ik experimenteer met EXISTS, ALL,ANY enz...
Ik zie geen fout in dis subquery. Waarom krijg ik alle records? Waarom is >3700 genegeerd?
 
Deze werkt wel:
SELECT naam, depnr, loon
FROM werkn
WHERE EXISTS
(SELECT * FROM dep WHERE loon > 3700 and werkn.werknr=dep.depnr);

Waarom wordt hier wel rekening gehouden met loon >3700?
 
Er wordt altijd rekening gehouden met het loon. In de eerste query vraag je : als er een werknemer is met een loon van meer dan 3700, toon dan naam, depnr en loon van de werknemers.
In de tweede query zit volgens mij de link tussen werkn.werknr = dep.depnr niet echt goed: daar vraag je degene waar toevallig het ID van het departement gelijk is aan het ID van de werknemer? Dat kan toevallig een correct antwoord geven.
Ik denk dat wat je wil:
Code:
SELECT naam, depnr, loon
FROM werkn
WHERE EXISTS
(SELECT * FROM werkn W WHERE loon > 3700 and W.werknr=werkn.werknr);
 
Ja, jouw query is juist. Bedankt.
Ik snap dat de eerste query alles levert omdat voor elke record, het altijd waar is dat er een loon>3700 is.
Maar hoe komt het dat het werkt met dat stukje toegevoegd (... and werkn.werknr=w.werknr) ? De enige uitleg is dat hij de record vergelijkt van de tabel met die van de subquery (dus met loon >3700). Alleen diegenen die hetzelfde werknr worden geselecteerd.
 
Als je de subquery bekijkt zie je dat ik de tabel werkn daar het alia W heb gegeven. In het geheugen bestaan er dus 2 datasets met werknemers: werkn uit de hoofdquery en W uit de subquery, aan elkaar gekoppeld via het PK veld werknr.
Let wel op met subqueries: die vertragen de query. Dus in normale werkomstandigheden: probeer deze te vermijden waar je kan.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan