слишком медленный для результата любой может дать повышение (запросите рабочий файл для 10 записей, но найдите больше записей)) - PullRequest
0 голосов
/ 10 марта 2019
select a , b , c
from h1 where a  in
(
    select a
    from h1
    group by a
    having count(distinct b) = 1
)

Ответы [ 4 ]

2 голосов
/ 10 марта 2019

Самый эффективный метод должен быть not exists:

select h.a, h.b, h.c
from h1 h
where not exists (select 1 
                  from h1 hh
                  where hh.a = h.a and hh.b <> h.b
                 );

Для производительности вам нужен индекс на h1(a, b).

Агрегирование не требуется.

0 голосов
/ 11 марта 2019

IN ( SELECT ... ) может быть ужасно медленным. Помимо использования EXISTS(...) иногда полезно использовать «производную таблицу»:

select  h1.a , h1.b , h1.c
    FROM  
    (
        SELECT  a
            from  h1
            group by  a
            having  count(distinct b) = 1 
    ) AS x
    JOIN  h1 USING(a)
0 голосов
/ 10 марта 2019

Я предлагаю добавить следующий индекс в вашу таблицу:

CREATE INDEX idx ON h1 (a, b, c);

Затем перепишите ваш запрос следующим образом:

SELECT a, b, c
FROM h1 t1
WHERE EXISTS
(
    SELECT 1
    FROM h1 t2
    WHERE t1.a = t2.a
    GROUP BY t2.a
    HAVING MIN(t2.b) = MAX(t2.b)
);

В идеале индекс позволит MySQL довольно быстро оценить подзапрос агрегации. Обратите внимание, что мин / макс трюк говорит то же самое, что требование к отдельному счетчику равному 1. За исключением этой версии, можно использовать индекс.

0 голосов
/ 10 марта 2019

вы можете попробовать, используя существующий, в случае, если подзапрос вернул большой набор данных, он может работать лучше, чем в

select a , b , c
from h1 t1 where exists
(
    select 1
    from h1 t2
    t2.a=t1.a
    having count(distinct b) = 1
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...