SQL, combinatie van ontkenning met OR-functie

Status
Niet open voor verdere reacties.

Bart van Halen

Gebruiker
Lid geworden
20 aug 2010
Berichten
7
Ik hoop dat ik deze post in de juiste forumcategorie plaats, SQL is onlosmakelijk verbonden met zowel Access als Base (zij het dat er kleine verschillen zijn in hoe de code wordt verwerkt door de databasemanagement-software).

Stel dat ik een tabel MEDEWERKER heb met (o.a.) de kolommen Naam en Voornaam. De volgende namen komen voor.
Bart Janssen
Bart van Gaal
Ron Janssen
Ron van Gaal

Stel dat ik de volgende code invoer:
SELECT *
FROM MEDEWERKER
WHERE Voornaam<>Bart OR Achternaam <>Janssen

Waarom krijg ik dan wel de namen Bart van Gaal, Ron Janssen en Ron van Gaal?
Normaal gesproken houdt de logische of-functie toch in dat aan minstens een van beide voorwaarden moet worden voldaan? Ik zou daarom verwachten dat over geen van deze 4 namen data wordt gegeven.
 
Laatst bewerkt:
Dat zie je dus niet helemaal juist; de OR operator zorgt er juist voor dat slechts één van de voorwaarden wordt bekeken. Je zou dus de AND moeten gebruiken.
 
ja dit komt omdat je alles records pakt met * en dan vervolgens een filtering doet op de records met OR.
meer info
btw wou je nog iets bereiken of was dit je vraag?
Byee VRC
 
wat de Giga Senior zegt
Vraag opgelost?
Niet echt.
Wanneer je zonder ontkenning de OR-functie gebruikt, dus
...
WHERE ...='...' OR ...='...'
dan zou je alle data krijgen die
- aan de eerste voorwaarde voldoet
- aan de tweede voorwaarde voldoet
- aan beide voorwaarrden voldoet (wellicht zit hier mijn denkfout maar zo leerde ik het toch met wiskunde)

Naar analogie zou je bij
WHERE ...<>'...' OR ...<>'...'
verwachten dat je alle data krijgt die
- aan de eerste voorwaarde voldoet
- aan de tweede voorwaade voldoet
- aan beide voorwaarden voldoet

In plaats daarvan krijg je alle entries die slechts aan een van de 2 voorwaarden voldoen maar niet die entries die aan beide voorwaarden voldoen.
Hopelijk snappen jullie nu mijn probleem? Beter kan ik het niet uitleggen.
 
Laatst bewerkt:
Je maakt nog steeds een denkfout. Zodra je twee voorwaarden met OR combineert, krijg je:
alle data krijgen die
- of aan de eerste voorwaarde voldoet
- of aan de tweede voorwaarde voldoet
- of aan beide voorwaarden voldoet (dat volgt dan weer uit het feit dat als een record aan beide voorwaarden voldoet, hij automatiscdh ook aan één van de twee voorwaarden voldoet).

Simpel voorbeeldje:
Voorwaarde 1: Data >100 OR Voorwaarde 2: Data <500
Resultaat: alle records. want Data is altijd of >100, of <500.
Voorwaarde 1: Data >100 AND Voorwaarde 2: Data <500
Resultaat: alle records met Data tussen 100 en 500.

Voorwaarde 1: Data <100 OR Voorwaarde 2: Data >500
Resultaat: records met Data 0-100 en Data >500

Voorwaarde 1: Data <100 AND Voorwaarde 2: Data >500
Resultaat: niks, want één veldwaarde kan niet tegelijk <100 en > 500 zijn

Kortom: Leeg eens uit wat je wilt zien....
 
Dit voobeeld snap ik maar helaas vind ik met google alleen dit soort, voor mij, simpelere voorbeelden zonder ontkenning, het is juist de combinatie van ontkenning (<>) en OR waar ik op vastloop. Ofwel maak ik een logische redeneerfout (dat zal wel het geval zijn) ofwel hangt de werking van die OR-functie af van het al dan niet aanwezig zijn van die ontkennig.

Wat ik wil hebben?
Stel dat ik een lijst heb met voornamen en achternamen.
Ik wil wil enkel een combinatie van 1 specifieke voornaam met 1 specifieke achternaam niet oproepen (zowel de voornaam als de achternaam komt vaker voor maar slechts 1 keer in combinatie met elkaar) maar ik wil wel alle overige namen oproepen waarin die voornaam of die achternaam voorkomt, hoe werkt dat?
Ik weet dat het werkt met <...> OR <...> (puntjes staan voor de voornaam en achternaam) maar ik begrijp niet waarom.
 
Laatst bewerkt:
Ik wil wil enkel een combinatie van 1 specifieke voornaam met 1 specifieke achternaam niet oproepen
Dan krijg je toch:
Code:
WHERE Voornaam<>Bart AND Achternaam <>Janssen
Of word ik nou gek? Dit filter werkt in ieder geval prima voor je eerste voorbeeld...
 
Ik wil wil enkel een combinatie van 1 specifieke voornaam met 1 specifieke achternaam niet oproepen (zowel de voornaam als de achternaam komt vaker voor maar slechts 1 keer in combinatie met elkaar)

Stel je wilt de naam (Voornaam met achternaam) Jan Jansen uitsluiten. Dan moet je, volgens mij, dus zoeken op:

Voornaam niet gelijk aan Jan en Achternaam niet gelijk aan Jansen. Dan wordt je criteria dus

Voornaam <> Jan AND Achternaam <> Jansen.
 
De andere leden hebben het al goed uitgeled.

Maar vergeet even wat je hebt geleerd met wiskunde.
In dit geval
'Voornaam' = 'jan' or 'achternaam' = 'jansen' wil zeggen of het één of het ander óf alle gestelde voorwaarden.

Bij de AND wil het zeggen én de één én het ander.

Tenzij het een <> poort is dat wordt hij bij OR noch het één of het ander of allebei. Bij AND wil het zeggen noch het één noch het ander.


Hoop dat nu makkelijker is. Als je toh nog hulp wilt, dan kan ik mijn informatica boek wel inscannen en opsturen. Daar staat het heel duidelijk met opdrachten.

Groet
 
Alvast bedankt voor julie geduld en hulp.
Ik heb het PDF-document met zowel de vraag als het antwoord geupload, het gaat om vraag 13.
Ik heb geprobeerd om eveneens het databasebestandje zelf te uploaden (mdb-extensie) maar die extensie is blijkbaar niet toegestaan op dit forum. In plaats daarvan upload ik een PDF waarin die database is weergegeven.
Ik heb deze SQL-opdracht getest en ik ben er dus zeker van dat het werkt, ik heb de gegeven namen zorgvuldig vergeleken met de namen uit de tabel.

@McJack
Dank je voor je aanbod, indien je wat interessante voorbeelden wil inscannen dan stel ik dat zeer op prijs, ik heb enkel wat powerpointslides met een beknopte uitleg (zo'n 60 slides).
Alle overige vragen kan ik zelf oplossen, alleen die ene vraag lukt niet. Ik kan onthouden dat in een soortgelijk geval deze code werkt maar ik wil het graag ook begrijpen, daar heb ik meer aan.
 

Bijlagen

Laatst bewerkt:
Misschien kun je eens vertellen wat er uit komt als je onze tips opvolgt, en AND gebruikt i.p.v. OR. Want ik krijg precies het resultaat wat je voor ogen hebt, dus ik snap eigenlijk het probleem niet...
 
Ik heb geprobeerd om eveneens het databasebestandje zelf te uploaden (mdb-extensie) maar die extensie is blijkbaar niet toegestaan op dit forum

Bestand eerst comprimeren en daarna zippen of rarren, daarna kan je het uploaden. Wel binnen de toegestane grote natuurlijk.
 
Zoals ik vraag 13 lees is de oplossing die daarbij gegeven is gewoon fout.
Antwoord zou zoals ik de vraag lees moeten zijn:

SELECT *
FROM MEDEWERKER
WHERE Naam <> 'Bollen' AND Voornaam <> 'Roel';

AND operator dus ipv OR.

OR gebruik je als aan minstens 1 van meerdere voorwaarden moet worden voldaan.
AND gebruik je als aan alle voorwaarden moet worden voldaan.

PS beide oplossingen bij vraag 5 zijn fout, dit terzijde

Tardis
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan