Black Friday = Pricewatch Bekijk onze selectie van de beste Black Friday-deals en voorkom een miskoop.

[SQL] multiple database querie

Pagina: 1
Acties:

  • Bicky
  • Registratie: Maart 2006
  • Laatst online: 05-11 17:28
ik heb 2 tabellen.
1 met alle personen van de firma.
1 met de datums en scores van de jaarlijks uit te voeren test.
nu wil ik alle personen die dit jaar hun test nog niet hebben uitgevoerd en die de test moeten doen.


Tbl PersoneelTbl Testresultaat
idnaammoet test doenuseriddatum
1polja12007-01-01
2pietja12008-01-01
3janja22009-01-01
4geertnee22008-01-01
5dannyja32009-01-01
6geleja  
7sofieja  
8marcelja  


dus de uitkomst zou moeten zijn in deze voorbeeldtabel:
Pol ; danny; gele; sofie; marcel
ook het aantal van deze zou ik moeten hebben. (dus met count)

  • TheRookie
  • Registratie: December 2001
  • Niet online

TheRookie

Nu met R1200RT

Hoe ver ben je zelf al gekomen, wat heb je zelf al geprobeerd en wat lukte er niet ?

offtopic:
het zijn overigens niet meerdere databases, maar meerdere tabellen ;)

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18:37

Janoz

Moderator Devschuur®

!litemod

Wat lukt er niet? Wat heb je al geprobeerd? Wat kwam daaruit? Waarom kwam dat niet overeen met hetgeen je wilde?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • asfaloth_arwen
  • Registratie: Februari 2005
  • Laatst online: 20:15
Waar loop je vast? Wat lukt niet? Geef je huidige query en resultaten daarvan eens. Als ik het goed begrijp wil je de namen van de mensen waar 'moet test doen' ja is die het laatste jaar geen test gedaan hebben?

Vermeld ook even je SQL dialect :)

Overigens kun je ook even kijken in Programming FAQ - SQL :)

Edit: Sloom, spuit 11 enzo

[ Voor 22% gewijzigd door asfaloth_arwen op 13-01-2009 14:49 ]

Specs


  • Bicky
  • Registratie: Maart 2006
  • Laatst online: 05-11 17:28
Dit is mijn huidige query. ik krijg reeds alle personen die nog nooit hun test hebben gedaan.
maar ik krijg er de personen niet bij die hun test wel al vorige jaar hebben gedaan

select naam from tbl_users Left outer join tbl_testen on tbl_users.id = tbl_testen.userid
where tbl_testen.userid is null AND moettestdoen="ja"

  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Als je een filter toevoegt op het jaar, dan geeft de query wellicht betere resultaten terug!

When life gives you lemons, start a battery factory


  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Het ligt aan de tabel tbl_testen hoe de query zou moeten zijn. Als in tbl_testen alle users staan, moet je filteren op de test datum (IS NULL) en anders moet je filteren op het niet voorkomen van de user id in tbl_testen.

Jouw query gaat geen resultaat opleveren omdat je WHERE clause niet klopt. Je wilt alle userid's die null zijn opvragen uit tbl_testen. Dat gaat toch niet werken? Je moet of een alias aan de kolom meegegeven en daar op filteren of je vraagt het direct uit de tabel op:
SQL:
1
2
3
4
5
6
SELECT tbl_users.naam AS Moet_nog_trainen
FROM tbl_users, tbl_testen
LEFT OUTER JOIN tbl_testen ON tbl_users.id = tbl_testen.userid
WHERE tbl users.id <> tbl_testen.userid
AND moettestdoen = 'ja'
;
Eventueel kan <> naar NOT IN, maar dat ligt ongetwijfeld aan de SQL die gebruikt. Dat daar geen fatsoenlijke standaardisatie heeft plaatsgevonden :N

[ Voor 18% gewijzigd door Motrax op 13-01-2009 15:05 ]

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Niet zo kritisch Motrax.....als je een outer join gebruikt, dan kunnen userid's wel degelijk NULL zijn (en dit is precies wat je wil). Het enige wat ontbreekt in de where clausule is een filter op het jaar.

When life gives you lemons, start a battery factory


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Motrax: in de query die hij had is de outer join icm. is null een MySQL alternatief voor een not in/not exists

Who is John Galt?


  • Bicky
  • Registratie: Maart 2006
  • Laatst online: 05-11 17:28
En wat bedoel je met een filter op het jaar?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Bicky schreef op dinsdag 13 januari 2009 @ 15:14:
En wat bedoel je met een filter op het jaar?
Bicky schreef op dinsdag 13 januari 2009 @ 14:42:
nu wil ik alle personen die dit jaar hun test nog niet hebben uitgevoerd en die de test moeten doen.
Die conditie mist nog in je sql.

Who is John Galt?


  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Je wilt toch weten welke personen DIT JAAR hun test niet hebben uitgevoerd. Dan moet je toch filteren op het huidige jaar. In Oracle zou dit zo iets kunnen zijn (nb: ranzige code)
SQL:
1
2
select naam from tbl_users Left outer join tbl_testen on tbl_users.id = tbl_testen.userid 
where tbl_testen.userid is null AND moettestdoen="ja" AND datum between TRUNC(sysdate, 'yy') and TRUNC(add_ months(sysdate,12), 'yy')-1

When life gives you lemons, start a battery factory


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 18:37

Janoz

Moderator Devschuur®

!litemod

@KabouterSuper:
Je kunt niet testen op iets wat er niet is ;). De jaarfilter zal dus al opgenomen moeten worden in de join conditie, of er moet gebruik worden gemaakt van een 'where .. not exist/in' constructie.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

KabouterSuper schreef op dinsdag 13 januari 2009 @ 15:12:
Niet zo kritisch Motrax.....als je een outer join gebruikt, dan kunnen userid's wel degelijk NULL zijn (en dit is precies wat je wil). Het enige wat ontbreekt in de where clausule is een filter op het jaar.
Heh, weer wat geleerd d:)b . Ik schrijf zo SQL niet omdat het voor mij niet logisch is.


Over het jaar, als je 2009 wil hebben, zou je de sysjaar moeten opvragen en vergelijken, daarna weer bekijken of daar een waarde voor is of niet. Of je vraagt het hoogste jaar op met een MAX (en niet de GROUP BY vergeten!) en dan de oude jaren voor lief nemen.

Geen idee eigenlijk of je sysjaar kan opvragen, normaal deed ik dat met een tool en niet met plain SQL.

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


  • KabouterSuper
  • Registratie: September 2005
  • Niet online
Goed punt Janoz....die ansi syntax nekt me elke keer weer....schrijf toch gewoon alles in een WHERE clausule ;-)

SQL:
1
2
3
4
5
select naam from tbl_users Left outer join tbl_testen 
on tbl_users.id = tbl_testen.userid  AND 
datum between TRUNC(sysdate, 'yy') and TRUNC(add_ months(sysdate,12), 'yy')-1
WHERE 
tbl_testen.userid is null AND tbl_test.datum is NULL AND moettestdoen="ja" 


Dit gezegd hebbende is
SQL:
1
2
SELECT * FROM TBL_USERS WHERE moettestdoen='ja' and USERID NOT IN 
(select user_id from tbl_testen where blahblah met datum)

waarschijnlijk logischer.

@Motrax: dynamisch functies loslaten op datums levert vreselijke code op in sql, dus dit soort logica houd ik ook graag buiten mijn sql queries.

@Bicky: een tabel prefixen met TBL wordt afgeraden.

When life gives you lemons, start a battery factory


  • Bicky
  • Registratie: Maart 2006
  • Laatst online: 05-11 17:28
SQL:
1
2
SELECT * FROM TBL_USERS WHERE moettestdoen='ja' and USERID NOT IN 
(select user_id from tbl_testen where datum>='2009-01-01')
Deze eenvoudige query lost mijn probleem op. (een variatie hierop want mijn tabellen en variabelen noemen iets anders.)
op het eerste zicht toch. ben nu reeds thuis en morgen verlof.
snel even via vpn getest en ziet er goed uit.
@Bicky: een tabel prefixen met TBL wordt afgeraden.
Al mijn tabellen beginnen met TBL. waarom wordt dit afgeraden?
Dit aanpassen zal namelijk niet eenvoudig zijn.

[ Voor 0% gewijzigd door Bicky op 13-01-2009 17:04 . Reden: aanpassen spellingsfouten ]

Pagina: 1