Во-первых, не используйте ненужные подзапросы в FROM
, поэтому напишите это как:
SELECT h.a, h.b, h.c
FROM h1 h
WHERE a IN (SELECT hh.a FROM h1 hh GROUP BY hh.a HAVING COUNT(DISTINCT hh.b) = 1);
Это все равно будет очень паршивым. То, что вы хотите, это все строки, где значения a
имеют один b
. Итак:
select h.*
from h1 h
where not exists (select 1
from h1 hh
where hh.a = h.a and hh.b <> h.b
);
Намного лучше. Тогда для этого запроса вы хотите индекс на h1(a, b)
.
Вы также можете написать это, используя JOIN
:
SELECT h.a, h.b, h.c
FROM h1 h JOIN
(SELECT hh.a
FROM h1 hh
GROUP BY hh.a
HAVING MIN(hh.b) = MAX(hh.b)
) hh
ON hh.a = h.a;
Это агрегирует только один раз. И я также должен воспользоваться тем же индексом.