Produkte filtern nach zwei Merkmalen

Torte

Grünschnabel
Hallo,

ich hoffe Ihr könnt mir helfen. Ich möchte eigentlich mir nur alle Artikel anzeigen bei den zwei verschiedene Merkmale übereinstimmen. (SQL2008R2 Server)

Tabelle mit den Artikeln: (tblArtikel)
ArtID | Name
--------------------
artid1 | Socken
artid2 | Schuhe
artid3 | Gürtel
artid4 | Hemd

Tabelle mit den Merkmalen (tblMerkmale)

ArtID | Art | Merkmal
--------------------------
artid1 | Color | grün
artid1 | Color | blau
artid1 | Size | 42
artid1 | Size | 39
artid1 | Brand | Lacotze
artid2 | Size | 42
artid3 | Color | grün
artid3 | Color | braun
artid4 | Color | grün
artid4 | Size | 42
artid4 | Brand | Lacotze

SELECT tblArtikel.ArtID, tblArtikel.Name
FROM tblMerkmale LEFT OUTER JOIN tblArtikel ON tblMerkmale.ArtID = tblArtikel.ArtID
WHERE (tblMerkmale.Art='Color' AND tblMerkmale.Merkmal = 'grün') AND
(tblMerkmale.Art='Brand' AND tblMerkmale.Merkmal = 'Lacotze')

Leider zeigt es keine Datensätze an!?

Theoretisch müsste es mir jetzt nur folgende Artikel anzeigen:
artid1 | Socken
artid4 | Hemd


Wird aber "OR" verwendet, zeigt es mir auch noch alle anderen an die ich nicht selectiert habe.

Viele Grüße
Torte
 
Das liegt daran, dass Socken-Color-grün und Socken-Brand-Lacotze 2 verschiedene Entitäten sind.

Ich hoffe ich liege jetzt gedanklich nicht falsch, aber du könntest die Entities gruppieren, zählen und nur die anzeigen, welche auf die Zahl kommen (im Beispiel 2)
 
Versteeh ich richtig, du suchst all Lacotze Produkte mit der Fatrbe Grün.

Dann musst du die Tabelle tblMerkmale 2 mal einbinden.
SQL:
SELECT DISTINCT
    a.ArtID,
    a.Name
FROM
    tblArtikel a,
    -- Color
    tblMerkmale mc,
    -- Brand
    tblMerkmale mb
WHERE
    -- Color
    a.ArtID = mc.ArtID
    AND mc.Art='Color'
    AND mc.Merkmal = 'grün'
    -- Brand
    AND a.ArtID = mb.ArtID
    AND mb.Art='Brand'
    AND mb.Merkmal = 'Lacotze'

NMit OR müsstes du noch prüfen gruppieren und dabei prüfen, ob wirklich beide Argumente erfülltsind und nicht nur eines.
SQL:
SELECT
    a.ArtID,
    a.Name
FROM
     tblArtikel a
    INNER JOIN tblMerkmale m ON a.ArtID = m.ArtID

WHERE
     (m.Art='Color' AND m.Merkmal = 'grün')
   OR (m.Art='Brand' AND m.Merkmal = 'Lacotze')   
GROUP BY a.artID, a.name
HAVING COUNT(*) = 2

Ich persönlich finde die Erste Variante besser.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück