Problem mit SQL-Statement
Andre Victor
- datenbank
0 Nick
Hallo,
folgendes Problem:
habe 3 Tabellen
1. artikel
2. artikelzubehoer
3. zubehoer
artikel und zubehoer stehen in einer n:m Beziehung, daher die Zwischentabelle artikelzubehoer.
Nun möchte ich all das Zubehoer angezeigt bekommen, welches sich in Zubehoer befindet, sollte jedoch in artikelzubehoer ein Artikel einem bestimmten Zubehoer zugeordnet sein, dann nur das mit der gesuchten Artikelnummer.
Beispiel: Suche nach Artikelnummer 123
In artikelzubehoer steht artikelnummer: 123 und artikelnummerzubehoer = 4711
Als Ergebnis soll nun 4711 erscheinen und zusätzlich das ganze Zubehör das nicht in der Zwischentabelle artikelzubehoer zu finden ist.
Ich möchte umgehen, das ich für jedes Zubehoer, das für alle Artikel gültig verfügbar ist ein Eintrag in der Zwischentabelle artikelzubehoer nötig ist.
Mein versuch mit
SELECT r.artikelnummerzubehoer, bezeichnung1, bezeichnung2, bild FROM zubehoer r LEFT JOIN artikelzubehoer rel ON (r.artikelnummerzubehoer = rel.artikelnummerzubehoer) AND (rel.artikelnummer ="1520005900");
liefert immer jegliches Zubehoer, auch jenes welches in artikelzubehoer eigentlich einem anderen Artikel zugeordnet ist.
Gruss
André
Hallo,
folgendes Problem:
habe 3 Tabellen
- artikel
- artikelzubehoer
- zubehoer
artikel und zubehoer stehen in einer n:m Beziehung, daher die Zwischentabelle artikelzubehoer.
Nun möchte ich all das Zubehoer angezeigt bekommen, welches sich in Zubehoer befindet, sollte jedoch in artikelzubehoer ein Artikel einem bestimmten Zubehoer zugeordnet sein, dann nur das mit der gesuchten Artikelnummer.
Beispiel: Suche nach Artikelnummer 123
In artikelzubehoer steht artikelnummer: 123 und artikelnummerzubehoer = 4711
Als Ergebnis soll nun 4711 erscheinen und zusätzlich das ganze Zubehör das nicht in der Zwischentabelle artikelzubehoer zu finden ist.
Ich möchte umgehen, das ich für jedes Zubehoer, das für alle Artikel gültig verfügbar ist ein Eintrag in der Zwischentabelle artikelzubehoer nötig ist.
Zum Verstaendnis: artikelzubehoer definiert nicht jede Beziehung zwischen artikel und zubehoer, sondern nur exklusive Verbindungen? D.h. ein Eintrag in zubehoer "gehoert" zu jedem artikel, wenn es keinen Eintrag in artikelzubehoer gibt?
Mein versuch mit
SELECT r.artikelnummerzubehoer, bezeichnung1, bezeichnung2, bild FROM zubehoer r LEFT JOIN artikelzubehoer rel ON (r.artikelnummerzubehoer = rel.artikelnummerzubehoer) AND (rel.artikelnummer ="1520005900");liefert immer jegliches Zubehoer, auch jenes welches in artikelzubehoer eigentlich einem anderen Artikel zugeordnet ist.
Was sind denn eigentlich die Primaerschluessel?
Nick
Zum Verstaendnis: artikelzubehoer definiert nicht jede Beziehung zwischen artikel und zubehoer, sondern nur exklusive Verbindungen? D.h. ein Eintrag in zubehoer "gehoert" zu jedem artikel, wenn es keinen Eintrag in artikelzubehoer gibt?
Das ist so korrekt. Ich müsste ja ansonsten in der Zwischentabelle artikelzubehoer für jeden Artikel jegliches Zubehoer hinterlegen, also z.B. artikelnummer = 1, artikelnummerzubehoer = 1
artikelnummer = 1, artikelnummerzubehoer = 2
artikelnummer = 1, artikelnummerzubehoer = 3
usw.
artikelnummer = 2, artikelnummerzubehoer = 1
artikelnummer = 2, artikelnummerzubehoer = 2
artikelnummer = 2, artikelnummerzubehoer = 3
Was sind denn eigentlich die Primaerschluessel?
Die Primärschlüssel sind in Tabelle artikel = artikelnummer und in zubehoer = artikelnummerzubehoer. In der Zwischentabelle artikelzubehoer sind dann nur diese beiden Primärschlüssel enthalten.
Gruss André
Hi,
ich würde mal sagen, dann musst/kannst du imho folgendes tun:
Selektiere alles Zubehör, welches direkt zu dem Artikel verlinkt ist. (Inner Join, Subquery)
Und füge mittels UNION (ALL) Operator die Selektion allen Zubehörs an, die nie in [artikelzubehoer] vorkommen.
Ich gehe davon aus, dass allgemeines Zubehör für alle Produkte, keine expliziten Einträge in [artikelzubehoer] hat.
Ansonsten könntest du "allgemeines" Zubhehör in der [zubehoer] Tabelle auch mit einem Bitflag kennzeichnen.
Cheers,
Frank
Hi,
ich würde mal sagen, dann musst/kannst du imho folgendes tun:
Selektiere alles Zubehör, welches direkt zu dem Artikel verlinkt ist. (Inner Join, Subquery)
Und füge mittels UNION (ALL) Operator die Selektion allen Zubehörs an, die nie in [artikelzubehoer] vorkommen.Ich gehe davon aus, dass allgemeines Zubehör für alle Produkte, keine expliziten Einträge in [artikelzubehoer] hat.
Ansonsten könntest du "allgemeines" Zubhehör in der [zubehoer] Tabelle auch mit einem Bitflag kennzeichnen.
Wollte mich noch herzlich bedanken. Die Denkanstösse haben gefruchtet. Habe es jetzt über eine UNION SELECT - Query gelöst.
André