Toon posts:

[Interbase/Delphi5] 2 views: omslachtig ?

Pagina: 1
Acties:

Verwijderd

Topicstarter
Wellicht een standaard probleem met een standaard oplossing, maar ik kon 'em niet vinden.

Deze gegevens heb ik:
- basisgegevens (partij_id, beginaantal)
- mutatiegegevens (partij_id, datum, aantal)

Wat ik wil is een overzicht met partijen/goederen waarvan het totaal aantal mutaties niet overeenkomt met het beginaantal. Zodoende krijg ik de huidige voorraad (>0) en adm. fouten (<0), lijkt me.

Deze views heb ik aangemaakt:
- totaal_mutaties; berekent van alle partijen het totaal aantal mutaties
- huidige_voorraad; pakt de bovenstaande view en de basisgegevens en doet daar de '<>' selectie op.

Ik heb mijn doel bereikt, maar ik krijg het gevoel dat ik 't via een omslachtige manier doe. Mijn vraag dus: kan dit sneller? 1 SQL-statement/view, stored procedure? Kan het m.a.w. eenvoudiger?

Graag jullie mening.

Verwijderd

code:
1
2
3
4
5
6
7
8
9
10
select 
  partij_id, 
  beginaantal - (select sum(aantal) from mutatietiegegevens
             where partij_id = basisgegevens.partij_id)
  as verschil
from
  basisgegevens
having
  beginaantal - (select sum(aantal) from mutatietiegegevens
             where partij_id = basisgegevens.partij_id) <> 0

Het 'having' gedeelte heb ik nog nooit in deze syntax gebruikt (en ik heb hier nu geen IB draaien), maar IB is over 't algemeen prima in staat om 'having' clauses te optimaliseren (en dus maar 1x uit te voeren). Of dat ook geldt bij deze subselect, zul je even moeten uittesten... :)

Views zijn in ieder geval vrijwel nooit nodig, tenzij je die wilt gebruiken om gegevens op een bep. manier aan de client te presenteren.

Verwijderd

Topicstarter
Beter!

Ik ga meteen ff uitproberen.

Verwijderd

Topicstarter
Having statement werkt perfect (ach en wee, mijn SQL basiskennis |:( )

'k Heb 't uiteindelijk als volgt gedaan:
code:
1
2
3
4
5
6
7
8
select 
  partij_id, 
  sum(aantal) as totaal
from
  basisgegevens left join mutatiegegevens on basisgegevens.partij_id=mutatiegegevens.partij_id
group by partij_id
having
  basisgegevens.beginaantal - sum(mutatiegegevens.aantal)  <> 0

Geeft 't zelfde resultaat als mijn 2 views!
Bedankt voor 't zetje.

/me fietst nog op een SQL-driewieler maar is vastberaden om ooit op een SQL-racefiets te fietsen. ;)