Hulp met genormaliseerd database te querien

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik ben nu een tijdje aan het bekijken hoe ik database moet opzetten en dergelijke en had een oude database van mij gepakt en geprobeerd te normaliseren. Volgens mij is het redelijk gelukt maar het lastige is dat ik er nu niet meer uitkom hoe ik echt gegevens moet querien hieruit. Ik weet wel hoe ik tabellen kan joinen maar ik zit nu toch echt vast. De database tabel opzet is alsvolgt:
tbl_bedrijf
bedrijf_idnaambedrijfadresbedrijf
1abedrijfadres 1
2bbedrijfadres 2
3cbedrijfadres 3
4dbedrijfadres 4
5ebedrijfadres 5


tbl_bedrijf_document
11
12
13
14
15
26
37
38
39
410
411
512
513
514


tbl_document
document_iddocumentnaamdocument_deel
1documentc
2documentc1
3documentc2
4documentc3
5documentc4
6documentb
7documenta1
8documenta2
9documenta5
10documenty1
11documenty2
12documentg
13documentg1
14documentg2


Nu kan ik bijvoorbeeld wel een query maken met 1 conditie bijv: selecteer alle bedrijf_id en namen met een document dat deel 1 bevat. Die kan ik redelijk simpel maken met een join en een where conditie:
SQL:
1
SELECT b.naambedrijf FROM tbl_bedrijf b JOIN tbl_bedrijf_document bd ON b.bedrijf_id = bd.bedrijf_id JOIN tbl_document d ON bd.document_id = d.document_id WHERE d.document_deel = 1


Dat lukt op zich wel maar nu wil ik het met twee condities doen dus zelfde query als hierboven maar nu wil ik de bedrijven selecteren die een document hebben met deel 1 en 2
SQL:
1
SELECT b.naambedrijf FROM tbl_bedrijf b JOIN tbl_bedrijf_document bd ON b.bedrijf_id = bd.bedrijf_id JOIN tbl_document d ON bd.document_id = d.document_id WHERE (d.document_deel = '1' AND d.document_deel = '2')

Deze query mislukt want ik kan nooit aan de condities voldoen omdat ik elk document_deel heb opgescheiden in aparte rijen (dit moet ik later denk ik ook nog opdelen naar een aparte tabel als ik erzo naar kijk)
Hoe zou ik deze data nu moeten ophalen? Heeft iemand enig idee hoe dit moet met evt een voorbeeld?

[ Voor 0% gewijzigd door Creepy op 04-09-2013 15:21 ]


Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:03

Creepy

Tactical Espionage Splatterer

SQL:
1
 WHERE (d.document_deel = '1' AND d.document_deel = '2')

Berenedeer eerst eens waarom hier altijd 0 resultaten uitkomen ;)
Ow, en ik heb ff code tags toegevoegd

[ Voor 15% gewijzigd door Creepy op 04-09-2013 15:22 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Creepy schreef op woensdag 04 september 2013 @ 15:21:
SQL:
1
 WHERE (d.document_deel = '1' AND d.document_deel = '2')

Berenedeer eerst eens waarom hier altijd 0 resultaten uitkomen ;)
Ow, en ik heb ff code tags toegevoegd
Had dat onderaan me post gezet. Ik kan nooit aan de condities voldoen oomdat de waarde in 2 aparte rijen staan. Dat is juist het probleem, ik heb geen idee hoe ik het nu moet opvragen.

Acties:
  • 0 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 11:42

EnnaN

Toys in the attic

Wat je doet is alle combinaties ophalen die aan je WHERE voldoen. Dus dat ze in aparte rijen staan is niet erg. Wat je kan doen (en waar Creepy heen wil denk ik), is om er een OR van te maken. Dan heb je dus alles die 1 hebben EN alle die 2 hebben.

Maar volgens mij wil je daar niet heen, want je wil 1 bedrijf die BEIDE heeft.

Wat je moet doen is de join die je maakt 2x doen, en dan met de tables die je bv d1 en d2 genoemt hebben je keuze maken: dus d1.document_deel = '1' AND d2.document_deel = '2'). Je zult dan wat dubbelen tegenkomen, maar die kan je er wel uit groupen (of met een d1.id < d2.id wegfilteren)

sig


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Of gewoon met twee correlated subquery's op beide condities controleren. (d.m.v. van b.v. EXISTS )

[ Voor 15% gewijzigd door Woy op 04-09-2013 15:40 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
EnnaN schreef op woensdag 04 september 2013 @ 15:33:
Wat je doet is alle combinaties ophalen die aan je WHERE voldoen. Dus dat ze in aparte rijen staan is niet erg. Wat je kan doen (en waar Creepy heen wil denk ik), is om er een OR van te maken. Dan heb je dus alles die 1 hebben EN alle die 2 hebben.

Maar volgens mij wil je daar niet heen, want je wil 1 bedrijf die BEIDE heeft.

Wat je moet doen is de join die je maakt 2x doen, en dan met de tables die je bv d1 en d2 genoemt hebben je keuze maken: dus d1.document_deel = '1' AND d2.document_deel = '2'). Je zult dan wat dubbelen tegenkomen, maar die kan je er wel uit groupen (of met een d1.id < d2.id wegfilteren)
Ik denk dat ik je wel begrijp.
Maar stel nou dat ik later veel meer condities wil meegeven (zeg maar de volgende condities):
code:
1
WHERE (document_deel = '1' AND document_deel = '2') AND (document_deel = '3' OR document_deel = '4')

dan zou ik voor elke conditie een aparte join moeten maken(dus een nieuwe tabel maken, dan zou het evt beter zijn om een view te maken zodat ik niet steeds die join hoef te maken?)?

@woy, correlated subqueries heb ik nog nooit van gehoord, dus moet even googlen om dat op zoeken.

Acties:
  • 0 Henk 'm!

  • EnnaN
  • Registratie: September 2002
  • Laatst online: 11:42

EnnaN

Toys in the attic

Als je wilt weten of 1 bedrijf die 4 documenten heeft, zul je toch naar al die 4 documenten moeten kijken, dus dan moet je dat inderdaad doen. Dat is natuurlijk allemaal indexed, en dus bloedsnel. Een view gaat je daar niet bij helpen, maar dat hoeft ook niet.

@correlated subquery: dat gaat ws hetzelfde ongeveer doen: je moet een document 1 met het juiste bedrijf (uit de 'hoofd' query gebruiken, vandaar correlated) zoeken, en 1 voor documetn 2 (de tweede subquery), en dat zou je ook moeten doen voor de eventuele 3e of 4e. dus ik zou zeggen: zelfde verschil...

sig


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Oke bedankt voor de antwoorden allemaal. Ik ga zelf even dingen uitproberen met de nieuwe informatie. Als ik er dan nog niet uitkom zal ik dit topic wel aanvullen met alles wat ik heb geprobeerd.
Pagina: 1