Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Abfragen auf EAV SQL Design

Sie müssen für jede Name/Wert-Kombination ein Prädikat hinzufügen:

  SELECT <whatever you need>
    FROM Entity_Table et
   WHERE et.e_name = 'Joe'
     AND EXISTS (SELECT 1 
                   FROM AttributeValue_Table avt
                   JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
                  WHERE ea.a_id = avt.av_id
                    AND avt.prop_name = 'color'
                    AND avt.prop_value = 'black')
     AND EXISTS (SELECT 1 
                   FROM AttributeValue_Table avt
                   JOIN Entity_AttrVal ea ON ea.e_id = et.e_id
                  WHERE ea.a_id = avt.av_id
                    AND avt.prop_name = 'whiskers'
                    AND avt.prop_value = 'short')

(Ich entschuldige mich, wenn mein Sql Server-Dialekt durchscheint)

Um eine beliebige Anzahl von Vergleichen durchzuführen, müssten Sie die SQL generieren und ausführen.

Wie in einem Kommentar gesagt, zeigt dies, dass EAV ein Schmerz ist (eigentlich ein Anti-Pattern), aber ich weiß aus Erfahrung, dass es manchmal einfach keine Alternative gibt, wenn wir an eine relationale Datenbank gebunden sind.