[SQL] Kolom uit twee verschillende tabellen halen

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
In een MySQL-database staan o.a. tabellen 'Kortingen', 'Artikelen' en 'ArtikelGroepen'.

Kortingen:
KortingRegelID (primary) - DebID - KortingSoort - KortingSoortID - KortingsPercentage

In het veld 'KortingSoort' kan 'Artikel' of 'Groep' staan, in KortingSoortID staat de ID van het/de betreffende artikel of groep (verwijzend naar primary-key in onderstaande tabellen).

Artikelen:
ArtikelID (primary) - Omschrijving - Groep

ArtikelGroepen:
GroepID (primary) - Omschrijving

Nu wil ik in een tabel op een ASP.NET-webform in een tabel het volgende weergeven:

KortingSoort - KortingSoortID - Omschrijving - KortingsPercentage

KortingSoort wordt uit de tabel 'Kortingen' gehaald en in dit veld kan dus 'Artikel' of 'Groep' staan.
KortingSoortID komt ook uit 'Kortingen' en betreft de ID van het/de betreffende artikel of groep.
In 'Omschrijving' moet de omschrijving van het/de betreffende artikel of groep komen. Dit wordt dus óf uit de tabel 'Artikelen' óf uit 'ArtikelGroepen' worden gehaald.
'KortingsPercentage' spreekt voor zich.

Hoe haal ik d.m.v. SQL 'Omschrijving' uit 'Artikelen' ALS KortingSoort = 'Artikel' en 'Omschrijving' uit 'ArtikelGroepn ALS KortingSoort = 'Groep'?

Voor alleen 'Artikelen' heb ik het volgende:

SQL:
1
2
3
4
SELECT Kortingen.*, Artikelen.Omschrijving
FROM Kortingen, Artikelen
WHERE KortingSoort = 'Artikel' 
AND Kortingen.KortingSoortID = Artikelen.ArtikelID;


Hoe los ik dit op voor 'Artikelen' én 'Groepen'?

[ Voor 22% gewijzigd door EmilneM op 28-11-2003 12:18 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Persoonlijk vind ik de andere JOIN stijl duidelijker leesbaar:

code:
1
2
3
4
5
6
7
8
SELECT
    *
FROM
    Tabel1
INNER JOIN
    Tabel2 ON Tabel1.Veld = Tabel2.AnderVeld
INNER JOIN
    Tabel3 ON Tabel2.Foo = Tabel3.bar

etc. etc. In de FAQ worden meer voorbeelden van JOINs gegeven

Oops! Google Chrome could not find www.rijks%20museum.nl


  • whoami
  • Registratie: December 2000
  • Nu online
Ik zou eerst eens een ander datamodel bedenken

https://fgheysels.github.io/


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
whoami schreef op 28 november 2003 @ 09:21:
Ik zou eerst eens een ander datamodel bedenken
* P_de_B heeft het datamodel eens goed bekeken en kan het alleen maar eens zijn

Oops! Google Chrome could not find www.rijks%20museum.nl


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
P_de_B schreef op 28 november 2003 @ 09:24:
[...]


* P_de_B heeft het datamodel eens goed bekeken en kan het alleen maar eens zijn
Hebben jullie suggesties? Ik neem aan dat het dan gaat om de tabel 'Kortingen', ik weet zo snel geen andere manier om dit beter en/of gemakkelijker op te lossen. Jullie snappen het probleem wel?

  • whoami
  • Registratie: December 2000
  • Nu online
EmilneM schreef op 28 november 2003 @ 09:38:
[...]


Hebben jullie suggesties? Ik neem aan dat het dan gaat om de tabel 'Kortingen', ik weet zo snel geen andere manier om dit beter en/of gemakkelijker op te lossen. Jullie snappen het probleem wel?
Ja, lees eens iets over normaliseren

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
Mijn tabellen zijn toch al aardig genormaliseerd (op 'KortingSoort' na)? Het enige wat ik nog kan bedenken is een tabel maken i.p.v. tabellen 'artikelen en 'groepen' waarin én de groepen én de artikelen zijn opgenomen, met een code erachter of het een groep of artikel is........

Tabel 'Artikelen_ArtikelGroepen
Artikelen_ArtikelGroepenID - ID - Omschrijving - Soort
1 - 3 - Artikel 3 - 1
2 - 2 - Artikel 2 - 1
3 - 1 - Groep 1 - 2

Tabel 'Soorten'
SoortID - SoortTitel
1 - Artikel
2 - Groep

Of is er een gemakkelijkere oplossing?

[ Voor 9% gewijzigd door EmilneM op 28-11-2003 10:29 ]


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:08

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 is trouwens ook wel benieuwd....

Je hebt een artikel tandpasta merk A, welke in de artikelgroep verzorging zit.

Nu wil je dat je alle artikelen in de artikelgroep verzorging 5% korting geven, behalve tandpasta merk A, deze moet 6% korting krijgen.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
@gorgi_19
Ik denk dat hij zowel een gehele productgroep als een apart artikel korting wil geven. Of het artikel in de betreffende productgroep zit is, naar mijn mening, niet relevant. 't Is zo juist heel flexibel.

@EmilneM
Is er al nagedacht over hoe je evt het tijdsaspect wil integreren dmv een prijshistory of is dit niet relevant?

/bookmarked

[ Voor 10% gewijzigd door GigaDave56 op 28-11-2003 11:20 ]

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
@gorgi_19
Ik denk dat hij zowel een gehele productgroep als een apart artikel korting wil geven. Of het artikel in de betreffende productgroep zit is, naar mijn mening, niet relevant. 't Is zo juist heel flexibel.
Het was mijn bedoeling om bij het aanmaken van een orderregel eerst te kijken naar of het betreffende artikel een korting heeft, is dit niet het geval, kijk dan naar de groep. Artikel overruled dus de groep.
@EmilneM
Is er al nagedacht over hoe je evt het tijdsaspect wil integreren dmv een prijshistory of is dit niet relevant?
Dit is (nog) niet relevant.

  • whoami
  • Registratie: December 2000
  • Nu online
Je model is totaal niet goed genormaliseerd imo.

Hoe kan je weten tot welke groep een artikel behoort?
Het veld kortingsoort in de tabel kortingen laat je beter weg, en je maakt imo beter 2 velden aan in die tabel, nl. artikelId en artikelgroepId oid.
Als het een korting is die op één artikel slaat, dan is artikelId ingevuld met het id van het betreffende artikel, is het een korting voor een hele groep, dan vul je het groepid in in artikelgroepId.

https://fgheysels.github.io/


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 18:08

gorgi_19

Kruimeltjes zijn weer op :9

EmilneM schreef op 28 november 2003 @ 11:29:
Dit is (nog) niet relevant.
Als je het woordje nog kan wegstrepen: akkoord.
Als het in de toekomst zeker gaat gelden, zou ik er nu maar vast rekening mee houden, aangezien dit een vrij lastig punt kan zijn.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 28 november 2003 @ 11:50:
Je model is totaal niet goed genormaliseerd imo.

Hoe kan je weten tot welke groep een artikel behoort?
Heb aantal velden weggelaten in mijn beschrijving.....waaronder 'groep' in 'artikelen', heb het aangepast in de topicstart.
Het veld kortingsoort in de tabel kortingen laat je beter weg, en je maakt imo beter 2 velden aan in die tabel, nl. artikelId en artikelgroepId oid.
Als het een korting is die op één artikel slaat, dan is artikelId ingevuld met het id van het betreffende artikel, is het een korting voor een hele groep, dan vul je het groepid in in artikelgroepId.
Duidelijk, maar hoe geef ik het dan goed weer in een tabel.... Is niet echt mooi om 2 kolommen weer te geven als er steeds maar 1 gevuld is.......hetzelfde geldt (eigenlijk nog meer) voor 'Omschrijving'.

  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
EmilneM schreef op 28 november 2003 @ 11:29:
[...]

Het was mijn bedoeling om bij het aanmaken van een orderregel eerst te kijken naar of het betreffende artikel een korting heeft, is dit niet het geval, kijk dan naar de groep. Artikel overruled dus de groep.


[@EmilneM]
Is er al nagedacht over hoe je evt het tijdsaspect wil integreren dmv een prijshistory of is dit niet relevant?


Dit is (nog) niet relevant.
Tegenstrijdig vindt ik:
1) een order is tijdsgebonden.
2) een korting is tijdsgebonden, een prijsverlaging is structureel. Hoe kun je verschil zien in jouw opzet?

Echter, zoals gorgi_19 zegt,
Als je het woordje nog kan wegstrepen: akkoord

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


  • whoami
  • Registratie: December 2000
  • Nu online
EmilneM schreef op 28 november 2003 @ 12:05:
[...]
Duidelijk, maar hoe geef ik het dan goed weer in een tabel.... Is niet echt mooi om 2 kolommen weer te geven als er steeds maar 1 gevuld is.......hetzelfde geldt (eigenlijk nog meer) voor 'Omschrijving'.
Door goed te joinen, op beide velden (met een OUTER join)

code:
1
2
3
SELECT * FROM kortingen
LEFT JOIN artikel ON kortingen.artikelId = artikel.artikelid
LEFT JOIN artikelgroep ON kortingen.artikelgroepid = groep.groepid

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 28 november 2003 @ 12:21:
[...]


Door goed te joinen, op beide velden (met een OUTER join)

code:
1
2
3
SELECT * FROM kortingen
LEFT JOIN artikel ON kortingen.artikelId = artikel.artikelid
LEFT JOIN artikelgroep ON kortingen.artikelgroepid = groep.groepid
Dan krijg je als resultaat 2 kolommen omschrijving (1 van groep en 1 van artikel) dus kan ik in mijn datagrid 'kortingen' nog steeds niet de omschrijving van óf een artikel óf een groep in 1 kolom weergeven.

  • GigaDave56
  • Registratie: Juni 2001
  • Laatst online: 14-12-2025
whoami schreef op 28 november 2003 @ 12:21:
[...]


Door goed te joinen, op beide velden (met een OUTER join)

code:
1
2
3
SELECT * FROM kortingen
LEFT JOIN artikel ON kortingen.artikelId = artikel.artikelid
LEFT JOIN artikelgroep ON kortingen.artikelgroepid = groep.groepid
Er staat duidelijk " * from kortingen ", dan krijg je alle kolommen uit de tabel kortingen terug, toch :?

Not so Giga One
> I'd sell my soul for you, babe
> For money to burn, for you
> I'd give you all and have none, babe
> Just to, just to, to have you here by me... [Scooter - Rebel yell]


  • whoami
  • Registratie: December 2000
  • Nu online
EmilneM schreef op 28 november 2003 @ 12:44:
[...]


Dan krijg je als resultaat 2 kolommen omschrijving (1 van groep en 1 van artikel) dus kan ik in mijn datagrid 'kortingen' nog steeds niet de omschrijving van óf een artikel óf een groep in 1 kolom weergeven.
Je krijgt 2 kolommen, waarvan er slechts 1 ingevuld zal zijn.

Mbhv COALESCE (als je SQL Server gebruikt) kan je dan de omschrijving ophalen van de not - null column:
code:
1
2
select coalesce(a.omschr, g.omschr) as omschr 
....


Misschien zijn er wel betere/efficiëntere oplossingen, maar ik ben nu te duf om er een te bedenken.

https://fgheysels.github.io/


  • EmilneM
  • Registratie: December 2001
  • Laatst online: 15-09-2023
whoami schreef op 28 november 2003 @ 13:00:
[...]


Je krijgt 2 kolommen, waarvan er slechts 1 ingevuld zal zijn.

Mbhv COALESCE (als je SQL Server gebruikt) kan je dan de omschrijving ophalen van de not - null column:
code:
1
2
select coalesce(a.omschr, g.omschr) as omschr 
....


Misschien zijn er wel betere/efficiëntere oplossingen, maar ik ben nu te duf om er een te bedenken.
Heb nu de volgende SQL-query en deze werkt prima!

SQL:
1
2
3
4
5
6
7
SELECT kortingen.*, 
  coalesce(artikelen.omschrijving, artikelgroepen.omschrijving) 
  AS Omschrijving FROM kortingen
LEFT JOIN artikelen ON (kortingen.kortingsoortid = artikelen.artikelid 
  AND kortingen.kortingsoort = 'artikel')
LEFT JOIN artikelgroepen ON (kortingen.kortingsoortid = artikelgroepen.groepid 
  AND kortingen.kortingsoort = 'groep')


Gebruik trouwens MySQL, blijkt dat 'coalesce' ook werkt.........
Pagina: 1