[SQL] vage query problemen

Pagina: 1
Acties:

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 30-08 20:47
Okee korte uitleg met een wat vereenvoudigt voorbeeld:
ik heb 2 tabellen:
persoon (pid, naam)
afwezig (pid, begin_datum, eind_datum)

Wat ik wil hebben: de personen die op een bepaalde datum (invoer door gebruiker) niet afwezig zijn. Het probleem: ik kom er net achter dat je in MySQL nog geen subquery's kan gebruiken. Oftewel mijn mooie oplossing met NOT EXISTS errort alleen maar een hoopje.
Nu zit ik te bouwen aan een INNER JOIN, maar die reageert weer alleen maar op gevallen waardoor geld p.pid = a.pid en dus niet op mensen die gewoon nooit afwezig zijn...
Iemand een idee met welke query ik wel de data krijg ik die graag wil hebben?

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

OUTER JOIN ?

Today's subliminal thought is:


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 30-08 20:47
Nee dan krijg ik het niet voor elkaar geloof ik... :(

Probeer het zelf:
CREATE TABLE test1 (pid, naam);
CREATE TABLE test2 (pid, getal);

Voeg wat rijen toe, en voeg tenminste 1 rij toe in test1 waarvan pid NIET voorkomt in test2. Probeer dan een SELECT statement met WHERE test2.getal < 1000 (bijvoorbeeld), en dan is het dus de bedoeling de mensen te krijgen waarvoor geld getal < 1000 of niet voorkomend in test2. Hoe ik dat met OUTER JOIN zou moeten doen weet ik niet?

  • cimbom
  • Registratie: Juni 2001
  • Laatst online: 26-04-2024

cimbom

Just Kidding

code:
1
2
3
4
5
6
7
8
9
SELECT
  PRS.NAAM
FROM
  PERSOON PRS
  LEFT OUTER JOIN AFWEZIG AFW ON PRS.PID = AFW.PID
WHERE
  NOT(INVOERDATUM BETWEEN AFW.BEGIN_DATUM AND AFW.EIND_DATUM)
  or
  AFW.PID IS NULL


DIT MOET WEL WERKEN
ALS HET NIET WERKT DAN RIGHT OUTER JOIN PROBEREN

edit: even code tag
sorry voor capslock

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 30-08 20:47
Geweldig, met een paar aanpassinkjes voor m'n eigen database werkt het perfect, nooit aan gedacht dat het zo simpel ook kon :S

[ edit ]Sorry te vroeg gejuicht, dit gaat goed totdat er een dubbele afwezigheidsdatum in de tabel komt te staan, dan vind ie alsnog een datum waarvoor het klopt en dus een naam...
Ik zou het zelf ook moeten weten maar kheb t allemaal geleerd met subquery's e.d. dat is toch wel vrij makkelijk in zo'n situatie :)
Maar kheb niet echt zin meer om te denken op dit moment :) ik ga morgen wel door als er hier dan geen antwoord staat ;)[ /edit ]

  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
gok (geen zin om na te denken, ben moee):
code:
1
2
3
4
5
6
7
select p.pid
from   persoon p, afwezig a
where  a.pid (+) = p.pid 
and    to_date('datum_die_je_wilt','je_formaat') 
                     between a.begindatum and a.einddatum
group  by p.pid 
having count(a.*) = 0


edit:
hmm, zelf ff omzetten naar "mysql-sql" als je denkt dat het kan werken

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
LEFT OUTER JOIN's blijven moeilijk geloof ik. :)
Probleempje met genoemde queries is dat de filter op datum bij de LEFT OUTER JOIN hoort.
Als deze filter gewoon in de WHERE komt dan gaat ie dus daar ook op filteren als er geen records in de tabel afwezig worden gevonden.

Ik weet trouwens niet zeker of MySQL meerdere filter toestaat in de LEFT OUTER JOIN, maar dat moet je maar even proberen.

Je query gaat er dan ongeveer zo uit zien (druk- en zetfouten voorbehouden :) )
code:
1
2
3
4
SELECT p.pid, p.naam
FROM persoon as p
LEFT OUTER JOIN afwezig as a ON a.pid = p.pid AND BepaaldeDatum BETWEEN a.begin_datum AND p.eind_datum
WHERE a.pid IS NULL

De JOIN op de tabel afwezig levert alleen records op als de persoon op betreffende datum afwezig is. Als een persoon niet afwezig is, is afwezig.pid dus NULL.
Als je vervolgens filtert op a.pid IS NULL, dan krijg je dus alle personen die op die datum niet afwezig zijn.

Never underestimate the power of


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 30-08 20:47
En jawel tis gelukt

met de volgende query werkt het goed:

code:
1
2
3
4
5
SELECT naam, p.pid 
FROM persoon AS p 
LEFT OUTER JOIN afwezig AS a ON p.pid = a.pid 
AND DATE_FORMAT('$datum','%Y-%m-%d') BETWEEN a.begin_datum AND a.eind_datum
WHERE a.pid IS NULL


Oftewel bedankt cameodski :)

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

iCe01 schreef op 11 oktober 2002 @ 12:12:
Oftewel bedankt cameodski :)
offtopic:
he, wacht effe, wie gaf als eerste een goed antwoord? :X ;)

Today's subliminal thought is:


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Annie schreef op 11 oktober 2002 @ 12:20:
offtopic:
he, wacht effe, wie gaf als eerste een goed antwoord? :X ;)
Jij gaf geen antwoord, maar slechts :) een hint in de goede richting.
Zoals je uit de later geposte queries kon zien, was dat alleen nog lang niet voldoende.
Ik kan de reactie van iCe01 dus wel begrijpen.

iCe01: graag gedaan en gebruik de volgende keer gewoon een RDBMS die subqueries wel begrijpt :) , want die zijn toch beter leesbaar en vaak ook nog sneller.

Never underestimate the power of


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

cameodski schreef op 11 oktober 2002 @ 12:59:
Jij gaf geen antwoord, maar slechts :) een hint in de goede richting.
Mijn excuses dat ik niet het volledige antwoord voorgekauwd heb.
Zal volgende keer beter m'n best doen. ;)

Today's subliminal thought is:


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Annie schreef op 11 oktober 2002 @ 15:12:
Mijn excuses dat ik niet het volledige antwoord voorgekauwd heb.
Zal volgende keer beter m'n best doen. ;)
Lijkt me een goed idee, scheelt mij weer tijd. :)

Het was weliswaar voorkauwen, maar toen ik de queries in de andere replies zag, schrok ik eigenlijk een beetje.
Soms blijkt het dan beter om maar gelijk het juiste antwoord te geven. Dan gaat er hopelijk bij een aantal mensen een lampje branden en kunnen ze het de volgende keer zelf.
Jouw hint was inderdaad wel juist, maar als iemand de oplossing met de left outer join nog nooit gezien hebt, kan ik me wel voorstellen, dat hij niet begrijpt wat ie er verder mee moet doen.

Never underestimate the power of


  • Dash2in1
  • Registratie: November 2001
  • Laatst online: 19-08 23:13
Wat was er precies mis met mijn query dan eigenlijk?

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Je filter op datum klopt niet. Het probleem is, dat we het hier hebben over een left outer join. In de where heb je daar wel rekening mee gehouden, maar niet in de and.
Als de filter op datum dus false oplevert, wordt dus het persoon record er ook uit gefilterd.

Hoewel, nu ik nog eens heel goed over nadenk: heel misschien werkt ie toch wel, maar dan moet het RDBMS dus wel zo slim zijn, dat ie in de gaten heeft dat het om een left outer join gaat en dus alle eventuele filters op de afwezig tabel ook als zodanig worden beschouwd.
Maar het begint dan wel heel erg ingewikkeld te worden en of dat in een iets andere situatie ook werkt?
Ik gebruik altijd het join keyword (tja, in MSSQL kan dat nu eenmaal), dus ik heb me nog niet verdiept in de in's en out's van dit soort constructies en als ik dit zo zie, ga ik dat toch liever maar niet doen.

Never underestimate the power of


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 30-08 20:47
cameodski schreef op 11 oktober 2002 @ 12:59:
[...]

iCe01: graag gedaan en gebruik de volgende keer gewoon een RDBMS die subqueries wel begrijpt :) , want die zijn toch beter leesbaar en vaak ook nog sneller.
Ik heb al de hint (;)) gekregen om eens naar postgress te gaan kijken, dat zou beter zijn voor mijn doel, dus dat zullen we eens gaan doen. Ben nog niet zo'n held in SQL, en helaas gaat m'n boek alleen in op subquery's... die outer joins had ik inderdaad nog nooit gezien. Ik was er heus wel uit gekomen na een tijdje, maar ja... als menig TI'er ben ik ook gewoon LUI :D

Verwijderd

iCe01 schreef op 13 oktober 2002 @ 13:13:
[...]
Ik was er heus wel uit gekomen na een tijdje, maar ja... als menig TI'er ben ik ook gewoon LUI :D
Misschien nuttig om te weten: vragen stellen uit luiheid wordt niet zo gewaardeerd.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
iCe01 schreef op 13 oktober 2002 @ 13:13:
Ik heb al de hint (;)) gekregen om eens naar postgress te gaan kijken, dat zou beter zijn voor mijn doel, dus dat zullen we eens gaan doen. Ben nog niet zo'n held in SQL, en helaas gaat m'n boek alleen in op subquery's... die outer joins had ik inderdaad nog nooit gezien. Ik was er heus wel uit gekomen na een tijdje, maar ja... als menig TI'er ben ik ook gewoon LUI :D
Luiheid wordt hier inderdaad niet gewaardeerd. Opscheppen ook niet trouwens. :)
Je geeft zelf al aan dat je niet zo'n held bent in SQL, dus waarom denk je dan dat je er zelf wel uitgekomen zou zijn? Het is inderdaad heel eenvoudig als je er naar kijkt, maar ik weet uit ervaring dat het zelf bedenken niet altijd meevalt.

Never underestimate the power of

Pagina: 1