Как использовать mysql JOIN без условия ON?

Можно ли написать запрос на соединение без оператора ON? и чем эти объединения отличаются LEFT JOIN, RIGHT JOIN работы.


person Alexander T.    schedule 09.05.2013    source источник
comment
Поскольку предложение ON сообщает серверу, как связаны таблицы, нет. Если все ваши разные типы соединения дают одинаковый результат, значит, вы что-то делаете неправильно, и добавление некоторого кода может помочь нам определить вашу проблему. А пока перейдите к Джеффу. Блог Этвуда для двухминутного ознакомления с различными типами соединений.   -  person fvu    schedule 10.05.2013
comment
@fvu Этот пост в блоге отвергнут его автором в комментариях и бесполезен. И MySQL, и SQLite допускают (INNER) JOIN без ON. (Обработка как ON 1=1, т.е. обработка как CROSS JOIN.)   -  person philipxy    schedule 02.03.2021


Ответы (3)


Эта тема рассматривается в документации MySQL.

Вот синопсис. При использовании join или inner join условие on необязательно. Это отличается от стандарта ANSI и отличается практически от любой другой базы данных. Эффект cross join. Точно так же вы можете использовать предложение on с cross join, что также отличается от стандартного SQL.

Перекрестное соединение создает декартово произведение, то есть все возможные комбинации 1 строки из первой таблицы и 1 строки из второй. Перекрестное соединение для таблицы с тремя строками («a», «b» и «c») и таблицы с четырьмя строками (скажем, 1, 2, 3, 4) будет иметь 12 строк.

На практике, если вы хотите выполнить перекрестное соединение, используйте cross join:

from A cross join B

намного лучше, чем:

from A, B

и:

from A join B -- with no on clause

Предложение on требуется для правого или левого внешнего соединения, поэтому обсуждение для них не имеет значения.

Если вам нужно понять различные типы объединений, вам нужно немного изучить реляционные базы данных. Stackoverflow не подходит для такого уровня обсуждения.

person Gordon Linoff    schedule 09.05.2013

См. пример в http://www.sitepoint.com/understanding-sql-joins-mysql-database/

Вы можете использовать «USING» вместо «ON», как в запросе

SELECT * FROM table1 LEFT JOIN table2 USING (id);
person Manu    schedule 30.10.2013
comment
Для дополнительного пояснения: объединяющий столбец в обеих таблицах должен иметь одинаковое имя, чтобы ИСПОЛЬЗОВАНИЕ работало. - person rmirabelle; 02.02.2016

Есть несколько способов сделать перекрестное соединение или декартово произведение:

SELECT column_names FROM table1 CROSS JOIN table2;

SELECT column_names FROM table1, table2;

SELECT column_names FROM table1 JOIN table2;

Пренебрежение условием on в третьем случае приводит к перекрестному соединению.

person Neel Sandell    schedule 02.12.2020