У меня есть запрос, который работает.
select contract_no AS c_no, cm_mac AS c_mc, MIN(tstamp) as time2, sum(1) as aps
from devices where
contract_no in
(select distinct(contract_no) from devices where
tstamp >= '2018-10-28 06:59:59' AND tstamp <= '2018-10-29 07:00:00')
group by contract_no, cm_mac;
Я понял, что запрос медленный, поэтому мне было интересно, можно ли в любом случае оптимизировать этот запрос?
Я думал, может быть, использовать EXISTS вместо IN, но в этом случае я не могу начать с EXISTS (SELECT 1 from .... where contract_no= contract_no )
, потому что мне нужно это DISTINCT
предложение.
Конечно, мне нужно вернуть те же результаты.
Можно ли как-то оптимизировать этот запрос?
UPDATE:
Я проверил отзывы, и вы правы. Если эти два запроса выполняются, я получаю одинаковые результаты.
Но дело в том, что полный запрос является более сложным, и если у меня нет этого подзапроса, я получаю больше результатов.
QUERY 1 (возвращает 72 строки, которые являются правильными):
SELECT id, contract_no, customer, address, cm_mac, aps
FROM (select * from new_installed_devices where insert4date >='2018-10-28'
AND insert4date <='2018-10-28' AND install_mark<2) as d1
left join
( select * from (select contract_no AS c_no, cm_mac AS c_mc,
MIN(tstamp) as time2, sum(1) as aps from devices_change
where contract_no in (select distinct(contract_no) from devices_change
where tstamp >= '2018-10-28 06:59:59' AND tstamp <= '2018-10-29 07:00:00')
group by contract_no, cm_mac ) as mtmbl
where mtmbl.time2 >= '2018-10-28 06:59:59' and mtmbl.time2 <= '2018-10-29
07:00:00' ) as tmp on d1.contract_no=tmp.c_no
where aps>0 group by contract_no, customer, address, cm_mac;
QUERY 2 (возвращает 75 строк, которые не являются правильными), и в этом подходе есть ваша рекомендация (включить два запроса в один):
SELECT id, contract_no, customer, address, cm_mac, aps
FROM (select * from new_installed_devices where insert4date >='2018-10-28'
AND insert4date <='2018-10-28' AND install_mark<2) as d1 left join
( select * from (select distinct(contract_no) AS c_no, cm_mac AS c_mc,
MIN(tstamp) as time2, sum(1) as aps from devices_change
where tstamp >= '2018-10-28 06:59:59' AND tstamp <= '2018-10-29 07:00:00'
group by contract_no, cm_mac ) as mtmbl
where mtmbl.time2 >= '2018-10-28 06:59:59' and
mtmbl.time2 <= '2018-10-29 07:00:00' ) as tmp
on d1.contract_no=tmp.c_no
where aps>0 group by contract_no, customer, address, cm_mac;