Вы можете преобразовать все эти подзапросы в объединения.Недостатком является то, что вы теряете удобочитаемость и можете получить огромный промежуточный результат, от которого вы должны избавиться с помощью DISTINCT
.Это может быть довольно дорого.NOT IN
можно преобразовать в анти-объединение (внешнее объединение и затем выбор несогласованных строк), что является еще одним шаблоном, который может привести к нежелательно большому промежуточному результату.
SELECT DISTINCT c.*
FROM contact c
JOIN businesschannel bc ON bc.partner_idpartner = c.partner_idpartner
JOIN business b ON bc.idbusinesschannel IN (b.idbusinessfrom, b.idbusinessto)
AND b.idbusiness = 5943
LEFT JOIN businesscontact bco ON bco.contact_idcontact = c.idcontact
AND bco.business_idbusiness = 5943
WHERE bco.contact_idcontact IS NULL;