Toon posts:

[SQL]Select query vraagje

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een tabel:
code:
1
2
3
4
5
6
7
8
9
EMP_ID    MT_TYPE    MT_NAME    MT_VALUE
-----------------------------------------
1      COMP   JAVA   4
1      TYPE   PERMA FULL
2      COMP   JAVA   5
3      TYPE   PERMA FULL
4      COMP   ENGLISH    5
5      TYPE   TIME   FULL
5      COMP   JAVA   2

Nu wil ik met een query alleen die EMP_ID's hebben die voldoen aan BEIDE onderstaande criteria:

criteria 1: (MT_TYPE = 'COMP' AND MT_NAME = 'JAVA' AND MT_VALUE > '3')

EN

criteria 2: (MT_TYPE = 'TYPE' AND MT_NAME = 'PERMA' AND MT_VALUE = 'FULL')

Feitelijk moet er dus een query komen die alleen EMP_ID 1 selecteert.

Maar een simpele query als deze werkt niet:

SELECT *
FROM Table
WHERE (MT_TYPE = 'COMP' AND MT_NAME = 'JAVA' AND MT_VALUE > '3')AND (MT_TYPE = 'TYPE' AND MT_NAME = 'PERMA' AND MT_VALUE = 'FULL')

Iemand een idee?

Verwijderd

SELECT *
FROM Table
WHERE (MT_TYPE = 'COMP' AND MT_NAME = 'JAVA' AND MT_VALUE > '3') OR (MT_TYPE = 'TYPE' AND MT_NAME = 'PERMA' AND MT_VALUE = 'FULL')
Zou ik denken :)
Want aan allebei voldoen gaat niet opschieten volgens mij.

Verwijderd

Topicstarter
Maar dat is juist het probleem. Er moet aan beide criteria worden voldaan. Dus 'OR' heeft geen zin, want die geeft minimaal 1 en mischien bij beide criteria de ID.

Verwijderd

Op woensdag 26 juni 2002 14:27 schreef HPE het volgende:
Maar dat is juist het probleem. Er moet aan beide criteria worden voldaan. Dus 'OR' heeft geen zin, want die geeft minimaal 1 en mischien bij beide criteria de ID.
Owja, nu snap ik je. Maar dat gaat met jou query natuurlijk nooit lukken, een query is per record, niet per 2 :)

  • whoami
  • Registratie: December 2000
  • Laatst online: 04-09 22:16
Wat is er allemaal groter dan '3' ?
Je moet er rekening mee houden dat uw value - veld geen numeriek veld is blijkbaar.
code:
1
> '3'

gaat dan ook niet als een numeriek veld geinterpreteerd worden. Volgens mij is 'FULL' ook groter dan 3.

https://fgheysels.github.io/


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 14:19

The Eagle

I wear my sunglasses at night

Lijkt me handig om dan met een JOIN of een UNION te werken. Kan je zo ff niet de syntax geven, maar is op internet vast heel veel over te vinden. Zoek anders eens in de bieb naar een boek over SQL ozfo

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


  • pistole
  • Registratie: Juli 2000
  • Laatst online: 09:03

pistole

Frutter

code:
1
2
3
4
5
6
SELECT * 
FROM Table
WHERE  
  (MT_TYPE = 'COMP' OR MT_TYPE = 'TYPE') AND 
  (MT_NAME = 'JAVA' OR MT_NAME='PERMA') AND 
  (MT_VALUE > '3' OR MT_VALUE = 'FULL')

zou het resultaat moeten geven. Ik zeg verder maar niets over het datamodel etc...
Op woensdag 26 juni 2002 14:46 schreef Tassadar het volgende:
nwah die geeft ook niet het gewenste resultaat.
ik denk dat je je datamodel gewoon wat aan moet passen, want dit is nix. zelfs als je deze ene query lukt, dan kom je met andere dingen weer in de knup met zo'n datamodel.
Helemaal waar maar ik vond het offtopic om dat te zeggen

Ik frut, dus ik epibreer


  • Tassadar
  • Registratie: September 1999
  • Laatst online: 03-09 22:12

Tassadar

l33t h4x0r :)

nwah die geeft ook niet het gewenste resultaat.
ik denk dat je je datamodel gewoon wat aan moet passen, want dit is nix. zelfs als je deze ene query lukt, dan kom je met andere dingen weer in de knup met zo'n datamodel.

Verwijderd

Topicstarter
OK het datamodel is erg vreemd. Maar dit is toch echt nodig.
Het is een soort verzameltable met data uit 22 tabellen.
Op woensdag 26 juni 2002 14:37 schreef The_Eagle het volgende:
Lijkt me handig om dan met een JOIN of een UNION te werken. Kan je zo ff niet de syntax geven, maar is op internet vast heel veel over te vinden. Zoek anders eens in de bieb naar een boek over SQL ozfo
NOFI: maar ik denk dat je zelf eens een boek moet gaan lezen over SQL, want een Union of een Join is niet mogelijk met maar 1 tabel :P

Maar ik heb een, niet zo fraaie, maar toch een oplossing gevonden:

SELECT EMP_ID
FROM table
WHERE (MT_TYPE = 'COMP' AND MT_NAME = 'JAVA' AND MT_VALUE > '3')
OR (MT_TYPE = 'TYPE' AND MT_NAME = 'PERMA' AND MT_VALUE = 'FULL')
GROUP BY EMP_ID
HAVING COUNT(EMP_ID) = 2


Niet fraai, werkt wel.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 12:47

Dido

heforshe

Je doet een select *
Welk(s) record(s) wil je hebben? Alle records met ID(1)?
Of alleen het ID ?
code:
1
2
3
4
5
6
7
8
9
10
SELECT EMP_ID 
FROM Table
WHERE EMP_ID IN (SELECT EMP_ID
             FROM Table
             WHERE MT_TYPE = 'COMP'
             AND MT_NAME = 'JAVA'
             AND MT_VALUE > '3')
  AND MT_TYPE  = 'TYPE' 
  AND MT_NAME  = 'PERMA' 
  AND MT_VALUE = 'FULL' )

Alle records met EMP_ID = 1:
code:
1
2
3
4
5
6
7
8
9
10
SELECT * 
FROM Table
WHERE EMP_ID IN  (WHERE EMP_ID IN (SELECT EMP_ID
                         FROM Table
                        WHERE MT_TYPE = 'COMP'
                          AND MT_NAME = 'JAVA'
                          AND MT_VALUE > '3')
              AND MT_TYPE  = 'TYPE' 
              AND MT_NAME  = 'PERMA' 
              AND MT_VALUE = 'FULL')

Zou het dan toch moeten doen.
Performancewise is het natuurlijk kl**e, maar goed... zoals gezegd ligt dat aan je datamodel

Als je met die OR een probleem hebt moet je je logica ff checken.

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Yeps niet zozeer ID(1) maar alleen de ID's dus dit kan ook:
code:
1
2
3
4
5
6
7
SELECT * FROM TABLE 
WHERE EMPID IN
  (SELECT EMPID FROM TABLE
   WHERE (MTTYPE = 'COMP' AND MTNAME = 'JAVA' AND MTVALUE > '3'))
AND EMPID IN
  (SELECT EMPID FROM TABLE
   WHERE (MTTYPE = 'TYPE' AND MTNAME = 'PERMA' AND MTVALUE = 'FULL'))

Verwijderd

Op woensdag 26 juni 2002 14:37 schreef The_Eagle het volgende:
...Zoek anders eens in de bieb naar een boek over SQL ozfo...
We leven niet meer in de middeleeuwen; check gewoon
mysql.com voor documentatie materiaal. :P

[opmerking:] Ook voor non-mysql is er genoeg te vinden :+

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 14:29
Op woensdag 26 juni 2002 15:10 schreef HPE het volgende:

NOFI: maar ik denk dat je zelf eens een boek moet gaan lezen over SQL, want een Union of een Join is niet mogelijk met maar 1 tabel :P
Naast het feit dat ik dit een wat merkwaardige opmerking vind voor iemand die zo'n 'datamodel' durft te posten is een union of join wel degelijk mogelijk met 1 tabel. Nooit van een self-join gehoord ?

Sterker nog, er is zo een cartesian self-join te bedenken die het antwoord op jouw oorspronkelijke probleem geeft, zij het dan in 1 row ipv 2.
code:
1
2
3
4
select * from tabel a, tabel b 
where (a.MT_TYPE = 'COMP' AND a.MT_NAME = 'JAVA' AND a.MT_VALUE > '3')
and (b.MT_TYPE = 'TYPE' AND b.MT_NAME = 'PERMA' AND b.MT_VALUE = 'FULL')
and a.emp_id = b.emp_id

(maar 'back to the drawing board' lijkt me een betere oplossing)

oh ja, NOFI natuurlijk

Verwijderd

Topicstarter
Op woensdag 26 juni 2002 16:44 schreef sverzijl het volgende:

Naast het feit dat ik dit een wat merkwaardige opmerking vind voor iemand die zo'n 'datamodel' durft te posten is een union of join wel degelijk mogelijk met 1 tabel. Nooit van een self-join gehoord ?
Ik post hier zo'n datamodel omdat ik nergens anders mee kan werken. Als het anders kon, had ik dat wel gedaan. Ik zie gelukkig zelf ook wel in dat het model verre van ideaal is en stukken beter zou kunnen.
Sterker nog, er is zo een cartesian self-join te bedenken die het antwoord op jouw oorspronkelijke probleem geeft, zij het dan in 1 row ipv 2.
code:
1
2
3
4
select * from tabel a, tabel b 
where (a.MT_TYPE = 'COMP' AND a.MT_NAME = 'JAVA' AND a.MT_VALUE > '3')
and (b.MT_TYPE = 'TYPE' AND b.MT_NAME = 'PERMA' AND b.MT_VALUE = 'FULL')
and a.emp_id = b.emp_id

(maar 'back to the drawing board' lijkt me een betere oplossing)

oh ja, NOFI natuurlijk
Dit creeert een cartesisch produkt en zoals ik al zei wil ik de ID waarbij aan alle criteria worden voldaan éénmaal worden weergegeven. Maareh in mijn laatste twee posts geef ik al aan een oplossing te hebben gevonden. Dus thnx anyway.

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 14:29
Op woensdag 26 juni 2002 17:42 schreef HPE het volgende:

[..]
Ik zie gelukkig zelf ook wel in dat het model verre van ideaal is en stukken beter zou kunnen.
[..]
gelukkig maar. er is dus nog hoop :)
zoals ik al zei wil ik de ID waarbij aan alle criteria worden voldaan éénmaal worden weergegeven.
Als je de query had uitgevoerd had je gezien dat dat ook het geval zou zijn, maar goed, t was natuurlijk ook niet bedoeld als daadwerkelijke oplossing voor je probleem, maar slechts om aan te geven dat er zoiets als self-joins bestaat.. success verder

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 12:47

Dido

heforshe

Op woensdag 26 juni 2002 15:47 schreef HPE het volgende:
Yeps niet zozeer ID(1) maar alleen de ID's dus dit kan ook:
code:
1
2
3
4
5
6
7
SELECT * FROM TABLE 
WHERE EMPID IN
  (SELECT EMPID FROM TABLE
   WHERE (MTTYPE = 'COMP' AND MTNAME = 'JAVA' AND MTVALUE > '3'))
AND EMPID IN
  (SELECT EMPID FROM TABLE
   WHERE (MTTYPE = 'TYPE' AND MTNAME = 'PERMA' AND MTVALUE = 'FULL'))
Ik zou toch voor de versie met een subquery gaan. performance zal sowieso niet te best zijn...

Wat betekent mijn avatar?


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 14:19

The Eagle

I wear my sunglasses at night

Op woensdag 26 juni 2002 15:10 schreef HPE het volgende:

NOFI: maar ik denk dat je zelf eens een boek moet gaan lezen over SQL, want een Union of een Join is niet mogelijk met maar 1 tabel :P
Sorry. Mijn SQL is een beetje roestig. Ik zei al dat ik je de syntax zo niet kon geven...:o

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Ik heb een soort gelijk probleem en
hoor iedereen zeggen dat het een foutief datamodel is. Wat is dan wel een goed datamodel?

bijvoorbeeld
tabel klant;
ID,
etc...

tabel verkoop
klanten_ID,
product_NAAM,
etc...

Nu wil ik alle klanten zien, die product A, B en D hebben gekocht.

Hoe ziet het datamodel en select-statement eruit?

  • Crazy D
  • Registratie: Augustus 2000
  • Laatst online: 03-09 15:18

Crazy D

I think we should take a look.

Op donderdag 27 juni 2002 16:39 schreef Fiori het volgende:
Nu wil ik alle klanten zien, die product A, B en D hebben gekocht.

Hoe ziet het datamodel en select-statement eruit?
Je moet niet van de output uitgaan, maar van de gegevens die je wilt opslaan, en de informatie die die gegevens moet(en?) voorstellen (das een beetje een kromme zin geloof ik... ;)). Aan de hand daarvan maak je je tabellen (zie Database Normalization And Design Techniques). Niet dat normalizeren heilig is, er zijn een aantal mensen hier die er meer van weten dan dat goed is voor een gemiddeld mens :P maar je hebt als je die link volgt en netjes stap voor stap doet, een behoorlijk leuke database. En dan zul je zien dat je query die jij wilt maken niet zo heel spannend is.

Exact expert nodig?

Pagina: 1