Вот ситуация, с которой я имею дело. Исходный запрос у меня был:
SELECT c.CustID, a.City, a.Country FROM Customers AS c
LEFT OUTER JOIN Addresses AS a ON c.CustID = a.CustID
WHERE c.LastName = 'Jones'
Так что я хотел бы показать всем клиентам с фамилией Джонс, даже без каких-либо адресов, и показать связанные с ними адреса. Но что, если я хочу предложение WHERE по адресам, но все равно показать всех клиентов? Например, если я сделаю это:
SELECT c.CustID, a.City, a.Country FROM Customers AS c
LEFT OUTER JOIN Addresses AS a ON c.CustID = a.CustID
WHERE c.LastName = 'Jones' AND a.Country = 'United States'
Я теряю клиентов, которых нет в Соединенных Штатах. Но это не то, что я хочу. Я хочу всех клиентов с фамилией 'Джонс' и пропускаю только адреса , которые не находятся в Соединенных Штатах. Вот решение, которое я придумал:
SELECT c.CustID, a.City, a.Country FROM Customers AS c
LEFT OUTER JOIN
(SELECT City, Country FROM Addresses
WHERE Country = 'United States') AS a
ON c.CustID = a.CustID
WHERE c.LastName = 'Jones'
В этом случае я все еще получаю всех клиентов с фамилией Джонс, но не вижу адресов, которые находятся за пределами США, что я и хотел.
Вот моя проблема: В третьем запросе я предполагаю, что SQL Server выбирает все адреса США, а затем выполняет объединение с таблицей «Клиенты», что означает множество не-Джонс адреса были выбраны без необходимости. Во втором запросе мне интересно, если SQL Server выбирает только адреса США, где LastName = 'Jones'
, во-первых, что, я думаю, сделает запрос намного быстрее. Так есть ли повышение производительности для второго запроса по сравнению с третьим? Кроме того, какой бы ответ вы ни ответили, не могли бы вы прокомментировать какие-либо различия при использовании внутренних объединений (если они есть), это было бы здорово.
Спасибо!