Schnittmenge aus einer Tabelle (SQL)
-
Hi, ich habe eine Tabelle, die Schlüssel-/Wertpaare speichert und diese einer ID zuordnet, also etwa so:
[code]
id | key | value
-------+-------+------
1 | farbe | rot
1 | menge | 2
1 | form | rund
2 | farbe | gelb
2 | menge | 3
2 | form | eckig
3 | farbe | gruen
3 | menge | 3
3 | form | eckigund ich will z.B. alle IDs mit menge=3 und form=eckig
Mein Versuch ist es erst alle ids mit menge=3 rauszusuchen, und danach die mit form=eckig. Und dann im Programm erst die Schnittmenge zu bilden, aber das ist ja bei größeren Datenmengen eher doof. Ideen?
-
Das kannst du direkt in SQL machen: Sieh dir mal UNION an.
(Hab jetzt nicht viel Zeit, aber irgendwie sieht die Tabelle nicht gut aus, erfüllt die überhaupt die 3. NF?)
MfG SideWinder
-
Die Tabelle ist nicht genau so aufgebaut, das sollte nur relativ einfach klar machen worum es geht.
UNION sieht schonmal ganz gut aus, danke.
-
Mit INNER JOIN
SELECT t.[id] FROM ( SELECT DISTINCT [id] FROM [tabellenname] ) AS t INNER JOIN [tabellenname] AS t1 ON t1.[id] = t.[id] AND t1.[key] = 'farbe' AND t1.[value] = 'rot' INNER JOIN [tabellenname] AS t2 ON t2.[id] = t.[id] AND t2.[key] = 'form' AND t2.[value] = 'eckig'
Das kann IDs doppelt liefern, wenn es z.B. 2x einen Eintrag "farbe = rot" mit der gleichen ID gibt.
Mit EXISTS
SELECT DISTINCT t.[id] FROM [tabellenname] AS t WHERE EXISTS ( SELECT * FROM [tabellenname] AS t1 WHERE t1.[id] = t.[id] AND t1.[key] = 'farbe' AND t1.[value] = 'rot' ) AND EXISTS ( SELECT * FROM [tabellenname] AS t2 WHERE t2.[id] = t.[id] AND t2.[key] = 'form' AND t2.[value] = 'eckig' )
Das liefert garantiert keine IDs doppelt.