Ответ 1
Как отметил Саймон, разница в производительности должна быть незначительной. Основная проблема заключалась в том, чтобы ваш запрос правильно выражал ваши намерения, и (особенно) вы получили ожидаемые результаты.
Как правило, вы хотите добавить фильтры в предложение JOIN только в том случае, если фильтр является условием объединения. В большинстве (не всех) случаях фильтр должен применяться к предложению WHERE, поскольку он является фильтром общего запроса, а не самого соединения.
AFAIK, единственный экземпляр, где это действительно влияет на результат запроса, - это использование OUTER JOIN.
Рассмотрим следующие запросы:
SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId
WHERE o.OrderType = "InternetOrder"
против.
SELECT *
FROM Customer c
LEFT JOIN Orders o ON c.CustomerId = o.CustomerId AND o.OrderType = "InternetOrder"
Первый возвращает одну строку для каждого заказа клиента, который имеет тип заказа "Интернет-заказ" . Фактически, ваше левое соединение стало внутренним соединением из-за фильтра, который был применен ко всему запросу (т.е. Клиенты, у которых нет "InternetOrder", вообще не будут возвращены).
Вторая вернет хотя бы одну строку для каждого клиента. Если у клиента нет заказов типа заказа "Интернет-заказ" , он вернет нулевые значения для всех полей таблицы заказов. В противном случае он вернет одну строку для каждого заказа клиента типа "Интернет-заказ" .