Query met tussentabellen??

Status
Niet open voor verdere reacties.

Coenen88

Gebruiker
Lid geworden
29 apr 2008
Berichten
7
Hallo,

ik heb de volgende 4 tabellen

Order
-----
Ordernr
klant
notitie_id

ordererregel
------------
ordernr
regelnr

notitie_id
notitie_text

toeslagregel
------------
ordernr
toeslagregelnr
notitie_id

notitie
--------
notitie_id
notitie_text

Een order kan zowel meerdere orderregels als meerdere toeslagregels hebben. Op orderniveau, als op orderregelniveau en toeslagregelniveau kan een tekst worden vastgelegd (is dus niet altijd het geval). Nu wil ik een rapport maken waarin voor elke order al deze teksten worden weergegeven. Ik heb het op de volgende manier geprobeerd, dus eerst de orderregeltekst en de toeslagregeltekst beiden in een tussentabel, maar dit blijkt niet te werken (query draait wel, maar lijkt te 'hangen'). Heeft iemand anders een idee? :confused:
----------------------------------------------------------------------------------------------------------------
select c.ordernr,
c.klantnr,
d.notitie_text,
l.regelnr,
l.notitie_text,
nvl(s2.sequence_no,'') Toeslagregelnr,
nvl(s2.note_text,'') Toeslagregeltekst
from order c,
orderregel l,
notitie d,

(select c.ordernr, l.regelnr, l.notitietekst
from order c, orderregel l
where c.ordernr = l.ordernr
and l.notitie_text is not NULL) s1

(select c.ordernr, ch.toeslagregelnr, d.notitie_text
from order c, toeslagregel ch, notitie_text d
where c.ordernr = ch.ordernr
and ch.notitie_id = d.notitie_id) s2

where c.ordernr = sl.ordernr(+)
and c.ordernr = s2.ordernr (+)
and c.notitie_id = d.notitie_id
 
Hallo,

Als ik je syntax zie dan is dit volgens mij SQL voor Oracle. Daar ben ik niet zo goed in. MAar aan je query valt me wel iets op:
In je Where statement heb je het over Sl. Moet dat niet S1 zijn?

Verder kun je volgens mij de eerste subquery laten vervallen. Je krijgt dan zoiets:
Succes!

select c.ordernr,
c.klantnr,
d.notitie_text,
l.regelnr,
l.notitie_text,
nvl(s2.sequence_no,'') Toeslagregelnr,
nvl(s2.note_text,'') Toeslagregeltekst
from order c,
orderregel l,
notitie d,

(select c.ordernr, ch.toeslagregelnr, d.notitie_text
from order c, toeslagregel ch, notitie_text d
where c.ordernr = ch.ordernr
and ch.notitie_id = d.notitie_id) s2

where c.ordernr = s2.ordernr (+)
and c.notitie_id = d.notitie_id
where c.ordernr = l.ordernr
and l.notitie_text is not NULL
 
Jouw oplossing werkt helaas ook niet helemaal. Ik heb hem nu zo gemaakt dat hij 2 tussentabellen maakt. In één tabel zet hij alle orderregels waarvoor er een notitie is. In de andere tabel zet hij alle toeslagregels waarvoor er een notitie is. Met onderstaande query haalt hij alles op omdat ik een outer join heb op alle tabellen. Ik krijg nu als uitkomst bijvoorbeeld:

Ordernr Ordertekst Orderregelnr Orderregeltekst Toeslagregel Toeslagregeltekst
1 |Een order 1 Regeltekst
2 | 2 Regeltekst 1 Toeslagtekst
3 1 Toeslagtekst
4

Wat ik nu wil is dat hij een regel NIET laat zien wanneer er voor die order geen enkele tekst bestaat (bij regel 4). En dat krijg ik nu niet voor elkaar. Please help :shocked
-------------------------------------------------------------------------------------------------------------------------
Mijn query:

select c.ordernr,
c.Klantnr,
d.notitie_text,
nvl(s2.regelnr, '') Orderregelnr,
nvl(s2.regeltext, '') Orderregeltekst,
nvl(s1.toeslagregelnr, '') Toeslagregelnr,
nvl(s1.toeslagregeltext, '') Toeslagregeltekst

from order c,
notitie d,

(select ch.ordernr, ch.toeslagregelnr, d.notitie_text
from toeslagregel ch, notitie_text d
where ch.notitie_id = d.notitie_id) s1,

(select l.ordernr, l.regelnr, d.notitie_text
from orderregel l, notitie_text d
where l.notitie_id = d.notitie_id) s2


where c.notitie_id = d.notitie_id(+)
and c.ordernr = s1.ordernr(+)
and c.ordernr = s2.ordernr(+)
 
Het laten zien van Null waarden (wat je eigelijk niet wilt) kun je regelen in je Joins.

Volgens mij moet je een heel eind komen door alle (+) uit je joins te halen.

Succes ermee
arjee
 
Dat lukt niet, omdat het alle teksten optioneel zijn. Het kan voorkomen dat een order wel een orderregeltekst heeft, maar geen ordertekst. Wanneer ik bijvoorbeeld het eerste (+) weghaal geef ik daarmee aan dat er een ordertekst aanwezig moet zijn. Nu mis ik in mijn resultaat echter alle orders die geen tekst hebben op orderniveau, maar wel een tekst op orderregelniveau.
 
Hallo,

ik heb de volgende 4 tabellen

Order
-----
Ordernr
klant
notitie_id

ordererregel
------------
ordernr
regelnr

notitie_id
notitie_text

toeslagregel
------------
ordernr
toeslagregelnr
notitie_id

notitie
--------
notitie_id
notitie_text

Een order kan zowel meerdere orderregels als meerdere toeslagregels hebben. Op orderniveau, als op orderregelniveau en toeslagregelniveau kan een tekst worden vastgelegd (is dus niet altijd het geval). Nu wil ik een rapport maken waarin voor elke order al deze teksten worden weergegeven. Ik heb het op de volgende manier geprobeerd, dus eerst de orderregeltekst en de toeslagregeltekst beiden in een tussentabel, maar dit blijkt niet te werken (query draait wel, maar lijkt te 'hangen'). Heeft iemand anders een idee? :confused:
----------------------------------------------------------------------------------------------------------------
select c.ordernr,
c.klantnr,
d.notitie_text,
l.regelnr,
l.notitie_text,
nvl(s2.sequence_no,'') Toeslagregelnr,
nvl(s2.note_text,'') Toeslagregeltekst
from order c,
orderregel l,
notitie d,

(select c.ordernr, l.regelnr, l.notitietekst
from order c, orderregel l
where c.ordernr = l.ordernr
and l.notitie_text is not NULL) s1

(select c.ordernr, ch.toeslagregelnr, d.notitie_text
from order c, toeslagregel ch, notitie_text d
where c.ordernr = ch.ordernr
and ch.notitie_id = d.notitie_id) s2

where c.ordernr = sl.ordernr(+)
and c.ordernr = s2.ordernr (+)
and c.notitie_id = d.notitie_id
Je queries genereren een hele hoop records omdat je ze niet joint. Aangezien een JOIN ansi sql is en Oracle waarschijnlijk hier wel aan voldoet, moet je je tabellen maar eens joinen. Dus wat je in je where clause hebt staan moet in je JOIN staan.

als je de queries uitvoert zoals je ze nu hebt wordt er een cartetisch product gegenereert. als bijvoorbeeld tabel A 5 records heeft en tabel B heeft 10 records en tabel C heeft 3 records, dan is het resultaat van je query 5*10*3 = 150 records. Dat is het resultaat waarop je where clause wordt uitgevoerd. Jij hebt waarschijnlijk wel meer records en daarom duren je queries zo lang.
 
Thanks! :thumb:

Ik heb m als volgt opgelost:

select c.ordernr,
c.klantnr,
d.notitie_text,
nvl(ch.sequencenr,''),
nvl(d2.notitie_text,''),
nvl(l.linenr,''),
nvl(d3.notitie_text,'')
from
order c
left join
notitie_text d on c.notitie_id = d.notitie_id
left join
orderregel l on c.ordernr = l.ordernr
left join
toeslagregel ch on c.ordernr = ch.ordernr
left join
notitie_text d2 on ch.notitie_id = d2.notitie_id
left join
notitie_text d3 on l.notitie_id = d3.notitie_id
where d.notitie_text is not null or d2.notitie_text is not null
or d3.notitie_text is not null
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan