Подтвердить что ты не робот

Какая разница между предложением 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

Разница заключается в том, где и на позиции, есть ли такой же результат возврата? и какая разница? работает ли СУБД одинаково? спасибо.

4b9b3361

Ответ 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