Какая разница между предложением where и предложением, когда таблица оставила соединение?
SQL1:
select t1.f1,t2.f2
from t1
left join t2 on t1.f1 = t2.f2 and t1.f2=1 and t1.f3=0
SQL2:
select t1.f1,t2.f2
from t1
left join t2 on t1.f1 = t2.f2
where t1.f2=1 and t1.f3=0
Разница заключается в том, где и на позиции, есть ли такой же результат возврата? и какая разница? работает ли СУБД одинаково? спасибо.
Ответы
Ответ 1
Предложение where
применяется ко всему набору результатов; on clause
применяется только к рассматриваемому соединению.
В приведенном примере все дополнительные условия, связанные с полями на внутренней стороне соединения, поэтому в этом примере два запроса фактически идентичны.
Однако, если вы включили условие в значение в таблице на стороне внешнего соединения, это имело бы значительную разницу.
Вы можете получить больше по этой ссылке: http://ask.sqlservercentral.com/questions/80067/sql-data-filter-condition-in-join-vs-where-clause
Например:
select t1.f1,t2.f2 from t1 left join t2 on t1.f1 = t2.f2 and t2.f4=1
select t1.f1,t2.f2 from t1 left join t2 on t1.f1 = t2.f2 where t2.f4=1
- делать разные вещи - первые будут объединены в записи t2, где f4 равно 1, а последнее эффективно возвращено во внутреннее соединение с t2.
Ответ 2
Первый запрос быстрее, чем второй, поскольку условие соединения более конкретное, чем второе: нет смысла возвращать записи, которые вы будете фильтровать с предложением where (лучше не возвращать их при all-query1)
В любом случае это зависит от оптимизатора запросов.
см. ниже:
Является ли JOIN быстрее, чем WHERE?
Ответ 3
Реляционная алгебра допускает взаимозаменяемость предикатов в предложении WHERE и INNER JOIN, поэтому даже запросы INNER JOIN с предложениями WHERE могут иметь предикаты, переупорядоченные оптимизатором, так что они могут быть исключены во время процесса JOIN.
Я рекомендую вам писать запросы наиболее читаемым способом.
Иногда это включает в себя сделать INNER JOIN относительно "неполным" и поставить некоторые из критериев в WHERE, чтобы упростить обслуживание списков критериев фильтрации.
Вы можете получить больше по этой ссылке:
http://ask.sqlservercentral.com/questions/80067/sql-data-filter-condition-in-join-vs-where-clause
Например, вместо:
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
AND c.State = 'NY'
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
AND a.Status = 1
Запись:
SELECT *
FROM Customers c
INNER JOIN CustomerAccounts ca
ON ca.CustomerID = c.CustomerID
INNER JOIN Accounts a
ON ca.AccountID = a.AccountID
WHERE c.State = 'NY'
AND a.Status = 1
Но это зависит, конечно.
Ответ 4
1)
SQL1: select t1.f1,t2.f2 from t1 left join t2 on t1.f1 = t2.f2 **and** t1.f2=1 and t1.f3=0
В этом парсер проверит каждую строку t1 с каждой строкой t2 с этими тремя условиями. Получение более быстрого результата.
2) SQL2: select t1.f1,t2.f2 from t1 left join t2 on t1.f1 = t2.f2 **where** t1.f2=1 and t1.f3=0
В этом случае соединение принимает только 1-е условие, а затем полученный результат от объединения фильтруется с этими двумя условиями. И потребуется больше времени, чем 1-й запрос.
Вы можете получить больше по этой ссылке: http://ask.sqlservercentral.com/info/80067/sql-data-filter-condition-in-join-vs-where-clause