В принципе, как я понимаю ваш вопрос, вы спрашиваете, как я могу заменить это:
where H.department_id in (select departmentid from...)
с этим:
where exists (select...)
или это:
where (select count(*) from ...) > 1
Это довольно просто. Один из методов может быть таким:
WHERE...
AND EXISTS (select c.pk_category_id
from tx_map_department_operator d
inner join m_operator as m
on d.fk_operator_id = m.pk_operator_id
inner join l_user_role l
on m.fk_role_id = r.pk_role_id
inner join l_category_type c
on d.fk_department_id = c.pk_category_id
where h.department_id = c.pk_category_id
and d.is_active = 1
and m.is_active = 1
and r.is_active = 1
and c.is_active = 1
)
Я удалил дополнительные объединения в is_active, потому что они были избыточными. Вы должны проверить, как он работает с вашими индексами, потому что это могло бы быть быстрее. Хотя я сомневаюсь в этом. Но стоит сравнить, быстрее ли добавлять предложение объединения (join on ... and x.is_active=y.is_active
) или проверять предложение where (x.is_active=1 and y.is_active=1 and z.is_active=1...
)
И я бы порекомендовал вам просто использовать exists
вместо count(*)
, потому что я знаю, что существующее должно прекратиться после нахождения 1 строки, тогда как счетчик, вероятно, продолжит выполняться до тех пор, пока не будет выполнено, а затем сравнится с вашим справочным значением count> 1).
Кроме того, у вас есть странный стандарт именования столбцов. У вас действительно есть префиксы PK для первичных ключей и префиксы FK для внешних ключей? Я никогда не видел этого.