Bagaimana cara menggunakan mysql JOIN tanpa kondisi ON?

106

Apakah mungkin untuk menulis query join tanpa ONpernyataan? dan bagaimana gabungan ini LEFT JOIN, RIGHT JOINbekerja.

Alexander T.
sumber
1
Karena ONklausa memberi tahu server bagaimana tabel terkait, tidak. Jika jenis gabungan Anda yang berbeda semuanya memberikan hasil yang sama, Anda salah melakukannya, dan menambahkan beberapa kode dapat membantu kami menemukan masalah Anda. Sementara itu, kunjungi blog Jeff Atwood untuk intro 2 menit tentang jenis gabungan yang berbeda.
fvu

Jawaban:

153

Dokumentasi MySQL mencakup topik ini.

Berikut sinopsisnya. Saat menggunakan joinatau inner join, onkondisinya opsional. Ini berbeda dari standar ANSI dan berbeda dari hampir semua database lainnya. Efeknya adalah a cross join. Demikian pula, Anda dapat menggunakan onklausa with cross join, yang juga berbeda dari SQL standar.

Gabungan silang menciptakan produk Kartesius - yaitu, setiap kemungkinan kombinasi 1 baris dari tabel pertama dan 1 baris dari tabel kedua. Gabungan silang untuk tabel dengan tiga baris ('a', 'b', dan 'c') dan tabel dengan empat baris (misalnya 1, 2, 3, 4) akan memiliki 12 baris.

Dalam prakteknya, jika Anda ingin melakukan cross join, gunakan cross join:

from A cross join B

jauh lebih baik daripada:

from A, B

dan:

from A join B -- with no on clause

The onklausul diperlukan untuk hak atau kiri luar bergabung, sehingga diskusi tidak relevan bagi mereka.

Jika Anda perlu memahami berbagai jenis gabungan, maka Anda perlu mempelajari beberapa basis data relasional. Stackoverflow bukanlah tempat yang tepat untuk tingkat diskusi tersebut.

Gordon Linoff
sumber
1
Belum pernah mendengar tentang bergabung silang atau membutuhkan satu ... sampai hari ini!
pergi
11

Lihat beberapa contoh di http://www.sitepoint.com/understanding-sql-joins-mysql-database/

Anda dapat menggunakan 'MENGGUNAKAN' alih-alih 'AKTIF' seperti dalam kueri

SELECT * FROM table1 LEFT JOIN table2 USING (id);
Manu
sumber
3
Untuk klarifikasi tambahan, kolom gabungan di kedua tabel harus sama dengan nama USING to work
rmirabelle