J'aime utiliser l'agrégation pour cela avec l'agrégation conditionnelle. Par exemple, pour votre première puce :
select a.carid
from attributes a
group by a.carid
having sum( (attribute, value) in ( ('color', 'red'), ('color', 'blue') ) ) > 0 and
sum( (attribute, value) in ( ('wheels', '2') ) > 0;
Le > 0
signifie que la combinaison attribut/valeur existe. Utilisez = 0
pour préciser que ça ne marche pas.