Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consultando no EAV SQL Design


Você precisa adicionar um predicado para cada combinação de nome/valor:
  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')

(Peço desculpas se meu dialeto do Sql Server brilha)

Para fazer um número arbitrário de comparações, você teria que gerar o SQL e executá-lo.

Como dito em um comentário, isso mostra que o EAV é uma dor (um antipadrão, na verdade), mas sei por experiência que às vezes simplesmente não há alternativa se estivermos vinculados a um banco de dados relacional.