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 | eckig

    und 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.


Anmelden zum Antworten