Фильтрация на соединении? - PullRequest
       2

Фильтрация на соединении?

15 голосов
/ 09 февраля 2011

Есть ли какой-либо аргумент в отношении производительности для фильтрации в объединении, в отличие от предложения WHERE?

Например,

SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
AND b.deleted = 0
WHERE a.field = 5

В отличие от

SELECT blah FROM TableA a
INNER JOIN TableB b
ON b.id = a.id
WHERE a.field = 5
  AND b.deleted = 0

Лично я предпочитаю последнее, потому что я считаю, что фильтрация должна выполняться в разделе фильтрации (ГДЕ), но есть ли какие-либо рабочие или иные причины для использования любого из этих методов?

Ответы [ 4 ]

25 голосов
/ 09 февраля 2011

Если оптимизатор запросов выполняет свою работу, нет никакой разницы (кроме ясности для других) в двух формах для внутренних объединений.

Тем не менее, при левом соединении условие в соединении означает средство для фильтрации строк из второй таблицы перед объединением. Условие в where означает фильтрацию строк из конечного результата после объединения. Это очень разные вещи.

1 голос
/ 09 февраля 2011

Я думаю, что это то, что вы ищете >> SQL join: предложение where против предложения on

0 голосов
/ 10 февраля 2011

С внутренними объединениями вы получите те же результаты и, вероятно, такую ​​же производительность.Однако с внешними объединениями два запроса будут возвращать разные результаты и совсем не эквивалентны, так как помещение условия в предложении where по сути изменит запрос с левого соединения на внутреннее соединение (если вы не ищете записи, где некоторыеполе равно нулю).

0 голосов
/ 09 февраля 2011

Нет, между этими двумя нет различий, потому что при логической обработке запроса WHERE всегда будет идти сразу после предложения фильтра (ON), в ваших примерах у вас будет:

  1. Декартово произведение (количество строк из таблицы A x количество строк из таблицы B)
  2. Фильтр (ON)
  3. Где.

Ваши примеры приведены в ANSI SQL-92, вы также можете написать запрос с использованием стандарта ANSI SQL-89 следующим образом:

SELECT blah FROM TableA a,TableB b
WHERE b.id = a.id AND b.deleted = 0 AND a.field = 5

ЭТО ИСТИННО ДЛЯ ВНУТРЕННИХ СОЕДИНЕНИЙ, С НАРУЖНЫМИ СОЕДИНЕНИЯМИ ПОДОБНО, НО НЕ ТОЛЬКО

...