Musisz dodać predykat dla każdej kombinacji nazwy/wartości:
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')
(Przepraszam, jeśli mój dialekt Sql Server świeci)
Aby wykonać dowolną liczbę porównań, musisz wygenerować kod SQL i wykonać go.
Jak powiedziano w komentarzu, pokazuje to, że EAV jest uciążliwy (właściwie anty-wzorzec), ale z doświadczenia wiem, że czasami po prostu nie ma alternatywy, jeśli jesteśmy przywiązani do relacyjnej bazy danych.