В чем разница между перекрестным соединением и внутренним соединением с одинаковым фильтром? - PullRequest
0 голосов
/ 28 октября 2019

Давайте посмотрим cross join:

select c1, c2, c3
from t1
cross join t2
where t1.f1 = t2.f2

и давайте посмотрим inner join:

select c1, c2, c3
from t1
inner join t2
on t1.f1 = t2.f2

В чем разница между двумя утверждениями с точки зрения производительности и функциональностии использование памяти?

1 Ответ

2 голосов
/ 29 октября 2019

Эти два запроса функционально идентичны, так же как и следующий запрос:

select c1, c2, c3
from t1, t2
where t1.f1 = t2.f2

Что мое личное мнение:

Всегда записывать внутренние объединения с помощьюJOIN ... ON ... или JOIN ... USING (...) синтаксис. Преимущества:

  1. Читателю сразу становится ясно, что вы делаете и каково условие соединения.

  2. Вы никогда не забудетечтобы написать условие соединения, потому что вы должны написать одно.

    Это защищает вас от запросов, которые возвращают 1 миллиард строк вместо 10000 только потому, что вы забыли некоторые условия соединения, что является частой ошибкой новичка.

Также обратите внимание, что хотя для внутренних объединений не имеет значения, пишете ли вы условие в JOIN или в предложении WHERE, оно имеет значение для внешних объединений.

...