Является ли 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 )
?
Спасибо.
Ответы
Ответ 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 от остальной части вашего предложения, что облегчает его понимание.