Archief - [sql] joins, meer dan 2 tabellen joinnen

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

rabsi

Legacy Member
Ik zal mijn vraag proberen ilustreren aan de hand van een eenvoudig voorbeeld

Stel ik heb een tabel 1=dieren
Elk dier heeft een primair en secundair kleur vb zebra (zwart, wit)
Ik heb ook een tabel 2=kleuren met alle kleuren

tabel 1: kollommen: primkey, naamdier, primair kleur (relatie primkey tabel2), secundair kleur (relatie primkey tabel2)
tabel 2: kollommen: primkey, naamkleur

Ik zou graag nen querry maken die mij alle dieren heeft die een zwarte kleur hebben (ofwel primair ofwel secundair)

Een querry die die mij alle dieren heeft met als primaire kleur zwart kan ik al door 1 join te doen. Maar dan krijg ik niet de dieren als secundaire kleur zwart hebben

Een querry maken waarbij een cijfer (primkey tabel2) moet opgeven als selectie critium om zo die dieren te vinden kan ik ook (maar wil ik niet doen, omdat het eigenlijke probleem veel complexer is dan dit voorbeeld, en de gebruiker niet in staat zal zijn om de primkey te weten van "het kleur" dat hij zoekt)

Ik hoop dat mijn vraag niet te onduidelijk is, mijn excuses als het wel zo is
kort geformuleerd hoe join ik tabel 2 2maal met tabel 1

alvast bedankt

Skarr

Legacy Member
door alias te gebruiken ?

select dier.*
from dier, kleur k1, kleur k2
where dier.primair = k1.primkey or dier.secundair = k2.primkey

rabsi

Legacy Member
Skarr zei:
door alias te gebruiken ?

select dier.*
from dier, kleur k1, kleur k2
where dier.primair = k1.primkey or dier.secundair = k2.primkey

"Een querry maken waarbij een cijfer (primkey tabel2) moet opgeven als selectie critium om zo die dieren te vinden kan ik ook (maar wil ik niet doen, omdat het eigenlijke probleem veel complexer is dan dit voorbeeld, en de gebruiker niet in staat zal zijn om de primkey te weten van "het kleur" dat hij zoekt)" (zie 1ste post)

sorry niet wat ik zocht (zullen waarschijnlijk meerdere joins nodig zijn)

toch bedankt voor de hulp en de moeite

wxphe

Legacy Member
select d1.*
from dier d1, dier d2, kleur
where
d1.id = d2.id and
( d1.kleur1 = kleur.id or d2.kleur2 = kleur.id ) and
kleur.naam = 'zwart'

killgore

Legacy Member
wxphe zei:
select d1.*
from dier d1, dier d2, kleur
where
d1.id = d2.id and
( d1.kleur1 = kleur.id or d2.kleur2 = kleur.id ) and
kleur.naam = 'zwart'

wat is er in godsnaam mis met

SELECT * FROM dier, kleur WHERE (dier.kleur1=kleur.id or dier.kleur2=kleur.id) AND kleur.naam='zwart'

(buiten dat een expliciete join iets beter zou zijn, ma soit)

met expliciete join bedoel ik dus:

SELECT * FROM kleur k
INNER JOIN dier d ON (d.kleur1=k.id OR d.kleur2=k.id)
WHERE k.naam='zwart'

rabsi

Legacy Member
killgore zei:
wat is er in godsnaam mis met

SELECT * FROM dier, kleur WHERE (dier.kleur1=kleur.id or dier.kleur2=kleur.id) AND kleur.naam='zwart'

(buiten dat een expliciete join iets beter zou zijn, ma soit)

met expliciete join bedoel ik dus:

SELECT * FROM kleur k
INNER JOIN dier d ON (d.kleur1=k.id OR d.kleur2=k.id)
WHERE k.naam='zwart'

thanks, enorme snelheidswinst... zelf op relatief klein databankje

Obliv`

Legacy Member
rabsi zei:
thanks, enorme snelheidswinst... zelf op relatief klein databankje

:eek: welk databasesysteem gebruik je dan?

Normaal zou die impliciete join toch moeten herschreven worden naar een expliciete join door het systeem zelf?

wxphe

Legacy Member
tja jong, ik ben er al tijdje uit hoor :p... .Met dat de eerste reply begon te joinen van 2 kleur tabellen, zaggek dat het niet klopte en dat hij de andere tabellen moet joinen. En ben vanuit dat opzocht vertrokken. Moestek van nul begonnen zijn, ging ik mss niet of minder snel tot mijn oplossing gekomen zijn ... . Nuja anyway zijn probleem is opgelost :p

greetz

rabsi

Legacy Member
Obliv` zei:
:eek: welk databasesysteem gebruik je dan?

Normaal zou die impliciete join toch moeten herschreven worden naar een expliciete join door het systeem zelf?

access

Ik bedoelde ==> snelheidsverschil tegonver de eerste goede oplossing die gegeven werd...

tussen de twee oplossingen van killgore merk ik geen snelheidsverschil

killgore

Legacy Member
Obliv` zei:
:eek: welk databasesysteem gebruik je dan?

Normaal zou die impliciete join toch moeten herschreven worden naar een expliciete join door het systeem zelf?

hij gaat dat herschrijven naar een cross join, dus dat is niet noodzakelijk dat hij op hetzelfde of een even efficiënt queryplan uitkomt (ik denk voor een dergelijke eenvoudige query wel, maar zou er zeker niet van uitgaan, ken uw joins gewoon).
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan