Является ли CROSS JOIN синонимом INNER JOIN без предложения ON? - PullRequest
26 голосов
/ 21 апреля 2011

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

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

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

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

Спасибо.

Ответы [ 2 ]

22 голосов
/ 21 апреля 2011

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

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

Область видимости таблиц в порядке 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 голосов
/ 21 апреля 2011

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

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

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

...