Другая альтернатива:
SELECT DISTINCT Aid FROM (
SELECT Aid,type,count(*) as n from B
GROUP BY Aid,type, ) as g
WHERE ( g.n=1 AND g.type = 3 )
OR ( g.n=3 AND g.type = 1 )
Я сомневаюсь, что это будет работать лучше, чем ваш оригинал.Вы, кажется, делаете лучшую стратегию: считайте только строки-кандидаты.Возможно, поможет некоторая избыточная предварительная фильтрация:
SELECT DISTINCT Aid FROM (
SELECT Aid,type,count(*) as n from B
WHERE g.type = 3 OR g.type = 1 -- prefilter
GROUP BY Aid,type, ) as g
WHERE ( g.n=1 AND g.type = 3 )
OR ( g.n=3 AND g.type = 1 )