select * from recipes
where id in (select matchIngredient.id from
((select id from recipes)
except
(select distinct recipe_id from recipe_ingredient
where not (ingredient_id = any (cast(@ingredient_ids as int[])))))
as matchIngredient
join
(select recipe_id from recipe_tag
where tag_id = any (cast(@tag_ids as int[]))
group by recipe_id
having count(tag_id) >= @tag_count) as matchTag
on matchIngredient.id = matchTag.recipe_id);