Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[SQL] hulp nodig bij opbouw

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoi,

Ik heb een query waar ik nu al 2 uur op zoek, misschien kunnen jullie mij wat helpen. Ik zal de situatie even verduidelijken via een relatieschema:
Afbeeldingslocatie: http://img522.imageshack.us/img522/8662/leveringln1.jpg
(Even vermelden dat het veld, geleverd bij tblProductPerBestelling verwijderd is, omdat het in strijd was met de regels van het normaliseren (berekend veld))
Dus het gaat over bestellingen en leveringen. Het wijst zichzelf een beetje uit, nu moet ik voor de leveringen selecteren op referentie (bestellingId) of op leverancier, dit lukt allemaal, maar ik mag enkel de records kiezen die een kleiner geleverd aantal hebben dan het bestelde aantal, dus alle openstaande bestellingen eigenlijk.
Dit heb ik
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT ppb.atl, ppl.atl
FROM
     tblLeveringen l, 
     tblBestellingen b, 
     tblBestellingPerLevering bpl, 
     tblProductPerBestelling ppb, 
     tblProductPerLevering ppl
WHERE 
     b.bestellingId = bpl.bestellingId AND
     b.bestellingId = ppb.bestellingId AND
     l.leveringId = bpl.leveringId AND
     l.leveringId = ppl.leveringId AND
     ppb.atl <= (
               SELECT
                    Sum(ppl1.atl) AS atl
               FROM
                    tblProductPerLevering ppl1
               WHERE 
                    ppl1.productId = ppb.productId AND
                    ppl1.leveringId = l.leveringId
             )

Hier krijg ik ook de records waar de som van geleverde goederen kleiner is dan de bestelde, maar ik denk dat ik weet waarana het ligt, die sum neemt gewoon de som van alle prodcutPerLevering records ipv van te filteren op het product die ik opgeef in de subquery

hopelijk kunnen jullie mij vertelen waar mijn fout ligt.

  • sopsop
  • Registratie: Januari 2002
  • Laatst online: 14:29

sopsop

[v] [;,,;] [v]

Ten eerste: waarom gebruik je geen joins?
Ten tweede: veldnamen zoals 'atl' maken het niet echt duidelijker. Ik neem aan dat je 'aantal' bedoeld, de rest van de velden schrijf je ook uit.

Daarbij krijg ik het gevoel dat je tever doordraaft bij het normaliseren. In mijn ervaring heeft een cross-reference tabel pas echt zin als er een extra property aan toe wordt gevoegd. Een crossreference met twee velden is imho nooit (zelden) nodig.

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:48
sopsop schreef op maandag 23 juli 2007 @ 16:20:
Ten eerste: waarom gebruik je geen joins?
Hij gebruikt joins, hij doet dat alleen via een andere notatie dan de syntax die jij gewoon bent. :)
Daarbij krijg ik het gevoel dat je tever doordraaft bij het normaliseren. In mijn ervaring heeft een cross-reference tabel pas echt zin als er een extra property aan toe wordt gevoegd. Een crossreference met twee velden is imho nooit (zelden) nodig.
Hoe ga je anders een meer-op-meer relatie modelleren ? Een koppel-tabel met enkel 2 velden kan gewoon. Je kan op geen andere (goede) manier een n-m relatie vastleggen.
M'n vraag is natuurlijk of een n-m relatie in het geval van 'bestellingen per levering' hier wel nodig is ? Een levering kan meerdere bestellingen bevatten, maar kan je één bestelling over meerdere leveringen 'uitsmeren' ?

Nu vraag ik me trouwens ook af wat het probleem nu eigenlijk is; je zegt dit:
Hier krijg ik ook de records waar de som van geleverde goederen kleiner is dan de bestelde
En ik ga er dan vanuit dat je dat niet wilt, terwijl je eerder wel dit zegt:
maar ik mag enkel de records kiezen die een kleiner geleverd aantal hebben dan het bestelde aantal

[ Voor 73% gewijzigd door whoami op 23-07-2007 18:09 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
quote: whoami
M'n vraag is natuurlijk of een n-m relatie in het geval van 'bestellingen per levering' hier wel nodig is ? Een levering kan meerdere bestellingen bevatten, maar kan je één bestelling over meerdere leveringen 'uitsmeren' ?
Dit is idd een terechte reactie maar het is wel degelijk correct in deze situatie. Een bestelling kan in meerdere keren geleverd worden, maar er kunnen in praktijk gebeurd het ook veel dat er een paar bestellelingen samen worden genoemen en samen worden geleverd.

Ik zeg idd:
quote: jellepunk
Hier krijg ik ook de records waar de som van geleverde goederen kleiner is dan de bestelde
Maar dat is van alle records, en niet per product, mijn subquery moet voor iedere selectie opnieuw uitgerekend worden en dit gebeurd (denk ik) niet. (dit is toch een correlated sub query, dit zou toch moeten lukken? :s)

[ Voor 4% gewijzigd door Verwijderd op 24-07-2007 08:44 ]


Verwijderd

Topicstarter
Hoi, bedankt voor de hulp maar ik heb de fout zelf gevonden:
het probleem lag erin dat ik de productId's nog moest joinen en dan heb je geen subquery nodig. dit is de basis voor een grotere query waar ik wel een subquery nodig heb maar dat doet er niet echt toe. hieronder zie je wat ik ervan gemaakt heb, het was blijkbaar niet zo moelijk, maar je kan je er blind op staren |:(
bedankt voor de replys en de hulp
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT
    ppb.productId,
    ppb.atl,
    SUM(ppl.atl)
FROM
    tblproductPerbestelling ppb,
    tblBestellingPerLevering bpl,
    tblproductPerLevering ppl,
    tblLeveringen l,
    tblBestellingen b
WHERE
    ppb.bestellingId = b.bestellingId AND
    ppl.leveringId = l.leveringId AND
    bpl.leveringId = l.leveringId AND
    bpl.bestellingId = b.bestellingId AND
    ppb.productId = ppl.productId AND
GROUP BY
    ppb.productId,
    ppb.atl
HAVING
    ppb.atl >=  SUM(ppl.atl)

[ Voor 3% gewijzigd door Verwijderd op 24-07-2007 10:29 ]