Я думаю, что наиболее эффективный способ позволить оптимизатору выполнять свою работу - избегать обеих версий с подзапросами.Почему бы не это?
SELECT *
FROM Units AS u
INNER JOIN pm_Properties AS p
ON p.PropertyId = u.PropertyId
INNER JOIN Leases AS l
ON l.UnitId = u.UnitId
AND l.IsActive = 1
WHERE p.State = 'CA';
Основываясь на предложении JNK, еще одна альтернатива заключается в следующем (но, как я предположил, может быть много проверок ввода-вывода на предмет действительной аренды, если существует большой процентне в CA):
SELECT *
FROM Units AS u
INNER JOIN pm_Properties AS p
ON p.PropertyId = u.PropertyId
WHERE p.State = 'CA'
AND EXISTS
(
SELECT 1 FROM Leases AS l
WHERE l.UnitId = u.UnitId
AND l.IsActive = 1
);
Конечно, вы знаете свои данные, свои индексы, свое оборудование, свои схемы использования и т. д. самый эффективный способ определить, какой маршрут вы используете.Лучше всего проверить их самостоятельно - это даст вам более надежный ответ, чем любой, кого вы можете спросить здесь.Никому не в обиду, но есть слишком много переменных, чтобы можно было сделать общее утверждение.
Кроме того - и это всего лишь пустяк - какой смысл создавать псевдоним таблицы Units -> unit?Вы набрали 4 дополнительных символа, чтобы избежать ввода одного - что может иметь смысл, если вы планируете ссылаться на Units более 4 раз в запросе, но особенно в этом случае я бы предпочел сделать более короткий псевдоним.