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

Является ли CROSS JOIN синонимом INNER JOIN без предложения ON?

Мне интересно, можно ли CROSS JOIN заменить INNER JOIN на INNER JOIN в любом запросе, когда он будет найден.

Является ли INNER JOIN без ON или USING точно таким же, как CROSS JOIN? Если да, то тип CROSS JOIN был изобретен только для того, чтобы лучше выразить намерение в запросе?

Приложение к этому вопросу будет:

Может ли быть разница с использованием современных и широко используемых СУБД при использовании CROSS JOIN ... WHERE x, INNER JOIN ... ON ( x ) или INNER JOIN ... WHERE ( x )?

Спасибо.

4b9b3361

Ответ 1

Во всех современных базах данных все эти конструкции оптимизированы для одного и того же плана.

В некоторых базах данных (например, SQL Server) требуется условие ON после INNER JOIN, поэтому ваш третий запрос просто не будет разбираться там.

Область видимости таблиц находится в порядке JOIN, поэтому этот запрос:

SELECT  *
FROM    s1
JOIN    s2
ON      s1.id IN (s2.id, s3.id)
CROSS JOIN
        s3

не будет анализироваться, а этот:

SELECT  *
FROM    s2
CROSS JOIN
        s3
JOIN    s1
ON      s1.id IN (s2.id, s3.id)

будет.

Ответ 2

Необработанное крест-соединение - это тот, у которого нет предложения where, означающего, что создается одна запись для каждой комбинации левых и правых таблиц, соединенных с нулями, вставленными там, где нет левых или правых данных.

Если вы добавляете предложение where к перекрестному соединению, это делает его эквивалентным внутреннему соединению, поскольку предложение where делает то же самое, что и ON во внутреннем соединении.

Однако внутренние соединения, как правило, более удобны в использовании, так как это отделяет условие ON от остальной части вашего предложения, что облегчает его понимание.