Apa perbedaan antara CROSS JOIN
dan INNER JOIN
?
LINTAS BERGABUNG:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status],
FROM
Customers
CROSS JOIN
Movies
INNER BERGABUNG:
SELECT
Movies.CustomerID, Movies.Movie, Customers.Age,
Customers.Gender, Customers.[Education Level],
Customers.[Internet Connection], Customers.[Marital Status]
FROM
Customers
INNER JOIN
Movies ON Customers.CustomerID = Movies.CustomerID
Mana yang lebih baik dan mengapa saya harus menggunakan yang mana?
sql
sql-server
sql-server-2008
tsql
cross-join
PriceCheaperton
sumber
sumber
CROSS JOIN
akan menghasilkan semua kemungkinan kombinasi tabel. mis. Table1 dengan 100 baris dan Table2 dengan 100 baris akan menghasilkan 10.000 catatan.x CROSS JOIN y
adalahx INNER JOIN y ON 1=1
Jawaban:
Gabung silang tidak menggabungkan baris, jika Anda memiliki 100 baris di setiap tabel dengan 1 hingga 1 pertandingan, Anda mendapatkan 10.000 hasil, Innerjoin hanya akan mengembalikan 100 baris dalam situasi yang sama.
2 contoh ini akan menghasilkan hasil yang sama:
Silang bergabung
Batin bergabung
Gunakan metode terakhir
sumber
select * from table1 cross join table2 where table1.id = table2.fk_id
sebagaiselect * from table1, table2 where table1.id = table2.fk_id
(ganticross join
dengan a,
)Ini adalah contoh terbaik dari Cross Join dan Inner Join.
Pertimbangkan tabel berikut
MEJA :
Teacher
MEJA :
Student
1. INNER BERGABUNG
Gabungan dalam memilih baris yang memenuhi kedua tabel .
Pertimbangkan kita perlu menemukan guru yang merupakan guru kelas dan siswa yang sesuai. Dalam kondisi itu, kita perlu menerapkan
JOIN
atauINNER JOIN
akanPertanyaan
Hasil
2. LINTAS BERGABUNG
Cross join memilih semua baris dari tabel pertama dan semua baris dari tabel kedua dan ditampilkan sebagai produk Cartesian yaitu, dengan semua kemungkinan.
Pertimbangkan kita perlu menemukan semua guru di sekolah dan siswa terlepas dari guru kelas, kita perlu menerapkan
CROSS JOIN
.Pertanyaan
Hasil
sumber
Cross Join
, apakah Anda pikir itu tidak mengembalikan semua baris kecualiWhere
diberikan klausa? Dari komentar Anda, ada banyak peluang bagi pemula untuk menjadi bingung !!! @philipxyCROSS JOIN = (INNER) JOIN = koma (",")
TL; DR Satu-satunya perbedaan antara SQL CROSS JOIN, (INNER) JOIN dan koma (",") (selain koma yang memiliki prioritas lebih rendah untuk urutan evaluasi) adalah bahwa (INNER) BERGABUNG dengan ON sementara CROSS JOIN dan koma tidak.
Kembali produk antara
Ketiganya menghasilkan produk "Cartesian" relasional konseptual SQL-style antara, alias gabungan silang, dari semua kemungkinan kombinasi baris dari setiap tabel. Ini HIDUP dan / atau DIMANA yang mengurangi jumlah baris. SQL Fiddle
SQL Standard mendefinisikan <comma> via produk (7.5 1.b.ii), <cross join> via <comma> (7.7 1.a) dan BERGABUNG DENGAN <kondisi pencarian> via <comma> ditambah WHERE (7.7 1.b ).
Seperti yang dikatakan Wikipedia:
Re OUTER bergabung dan menggunakan ON vs MANA di dalamnya melihat Kondisi di KIRI BERGABUNG (Outer JOIN) vs INNER JOIN .
Mengapa membandingkan kolom antar tabel?
Ketika tidak ada baris duplikat:
Setiap tabel memiliki baris yang membuat pernyataan benar dari templat pernyataan blank fill-in-the- [name-] tertentu. (Itu membuat proposisi yang benar dari-- memenuhi - predikat (karakteristik) tertentu .)
Tabel dasar menampung baris yang membuat pernyataan benar dari beberapa templat pernyataan yang diberikan DBA:
Produk perantara join memegang baris yang membuat pernyataan benar dari DAN dari templat operandnya:
ON & WHERE ketentuan ANDed in untuk memberikan templat lebih lanjut. Nilai lagi baris yang memenuhi templat itu:
Secara khusus, membandingkan kolom untuk (SQL) kesetaraan antar tabel berarti bahwa baris yang disimpan dari produk dari bagian templat tabel yang digabung memiliki nilai yang sama (non-NULL) untuk kolom tersebut. Itu hanya kebetulan bahwa banyak baris biasanya dihapus oleh perbandingan kesetaraan antara tabel - apa yang perlu dan cukup adalah untuk mencirikan baris yang Anda inginkan.
Cukup tulis SQL untuk templat untuk baris yang Anda inginkan!
Kembali makna kueri (dan tabel vs kondisi) lihat:
Bagaimana cara mendapatkan data yang cocok dari tabel SQL lain untuk dua kolom yang berbeda: Inner Join dan / atau Union?
Apakah ada aturan praktis untuk membangun query SQL dari deskripsi yang dapat dibaca manusia?
Overloading "gabung silang"
Sayangnya istilah "cross join" digunakan untuk:
Berbagai makna ini dikacaukan. (Misalnya, seperti dalam jawaban dan komentar lain di sini.)
Menggunakan CROSS JOIN vs (INNER) JOIN vs koma
Konvensi umum adalah:
Biasanya juga kondisi tidak pada pasangan tabel disimpan untuk WHERE. Tetapi mereka mungkin harus dimasukkan ke dalam (n BATIN) BERGABUNG untuk mendapatkan baris yang sesuai untuk argumen untuk GABUNG KANAN, KIRI atau PENUH (OUTER).
Kembali "Jangan gunakan koma" Mencampur koma dengan JOIN eksplisit dapat menyesatkan karena koma memiliki prioritas lebih rendah. Tetapi mengingat peran produk antara dalam arti CROSS JOIN, (INNER) JOIN dan koma, argumen untuk konvensi di atas untuk tidak menggunakannya sama sekali goyah. GABUNG LINTAS atau koma sama seperti (INNER) GABUNG yang dalam kondisi BENAR. Produk antara, AKTIF dan DIMANA semuanya memperkenalkan DAN dalam predikat yang sesuai. Namun yang lain INNER JOIN ON dapat dipikirkan - katakanlah, menghasilkan baris output hanya ketika menemukan sepasang baris input yang memenuhi kondisi ON - namun demikian mengembalikan baris gabungan silang yang memenuhi kondisi tersebut. Satu-satunya alasan ON harus menambahkan koma dalam SQL adalah untuk menulis OUTERBERGABUNG. Tentu saja, ungkapan harus membuat maknanya jelas; tetapi apa yang jelas tergantung pada apa yang dianggap berarti.
Diagram Re Venn Diagram Venn dengan dua lingkaran berpotongan dapat menggambarkan perbedaan antara baris output untuk INNER, LEFT, RIGHT & FULL JOINs untuk input yang sama. Dan ketika ON benar tanpa syarat, hasil INNER JOIN sama dengan CROSS JOIN. Juga dapat menggambarkan baris input dan output untuk INTERSECT, UNION & EXCEPT. Dan ketika kedua input memiliki kolom yang sama, hasil INTERSECT sama dengan standar SQL NATURAL JOIN, dan hasil EXCEPT sama dengan idiom tertentu yang melibatkan LEFT & RIGHT JOIN. Tetapi itu tidak menggambarkan bagaimana (INNER) BERGABUNG secara umum. Itu hanya tampaknya masuk akal pada pandangan pertama . Ini dapat mengidentifikasi bagian input dan / atau output untukkasus khususON, PK (kunci utama), FK (kunci asing) dan / atau PILIH. Yang harus Anda lakukan untuk melihat ini adalah mengidentifikasi apa sebenarnya elemen set yang diwakili oleh lingkaran . (Presentasi yang kacau tidak pernah membuat jelas.) (Ingat bahwa secara umum untuk bergabung baris output memiliki judul yang berbeda dari baris input . Dan tabel SQL adalah tas tidak set baris dengan NULLs .)
sumber
CROSS JOIN
. Saya bertanya-tanya seberapa sering seseorang datang ke SQL yang sudah akrab dengan produk Cartesian tetapi tidak dapat mengetahuinyaCROSS JOIN
.Bergabunglah dengan Batin
Gabung yang menampilkan hanya baris yang memiliki kecocokan di kedua tabel yang bergabung dikenal sebagai gabung dalam. Ini adalah default bergabung dalam permintaan dan melihat Desainer.
Sintaks untuk Bergabung Gabung
Silang Bergabung
Gabung silang yang menghasilkan produk Cartesian dari tabel yang terlibat dalam gabung. Ukuran produk Cartesian adalah jumlah baris di tabel pertama dikalikan dengan jumlah baris di tabel kedua.
Sintaks untuk Cross Join
Atau kita bisa menulisnya dengan cara lain juga
Sekarang periksa kueri di bawah ini untuk bergabung dengan Cross
Contoh
Atau
sumber
Harap diingat, jika klausa WHERE ditambahkan, tanda silang berperilaku seperti gabungan mata dalam. Sebagai contoh, pertanyaan Transact-SQL berikut menghasilkan set hasil yang sama. Silakan merujuk ke http://technet.microsoft.com/en-us/library/ms190690(v=sql.105).aspx
sumber
LINTAS BERGABUNG
Seperti yang saya jelaskan dalam artikel ini , CROSS JOIN dimaksudkan untuk menghasilkan Produk Cartesian.
Produk Cartesian mengambil dua set A dan B dan menghasilkan semua permutasi yang mungkin dari catatan pasangan dari dua set data yang diberikan.
Misalnya, dengan asumsi Anda memiliki tabel berikut
ranks
dansuits
database:Dan
ranks
memiliki baris berikut:Sementara
suits
tabel berisi catatan berikut:Sebagai CROSS GABUNG permintaan seperti yang berikut ini:
akan menghasilkan semua kemungkinan permutasi
ranks
dansuites
pasangan:INNER BERGABUNG
Di sisi lain, INNER JOIN tidak mengembalikan Produk Cartesian dari dua kumpulan data yang bergabung.
Sebagai gantinya, INNER JOIN mengambil semua elemen dari tabel sisi kiri dan mencocokkannya dengan catatan di tabel sisi kanan sehingga:
Misalnya, dengan asumsi kami memiliki hubungan tabel satu-ke-banyak antara tabel induk
post
danpost_comment
tabel anak yang terlihat sebagai berikut:Sekarang, jika
post
tabel memiliki catatan berikut:dan
post_comments
tabel memiliki baris ini:INNER BERGABUNG permintaan seperti yang berikut ini:
akan memasukkan semua
post
catatan beserta semua yang terkaitpost_comments
:Untuk detail lebih lanjut tentang cara kerja INNER JOIN, lihat artikel ini juga.
sumber
SQL Server juga menerima notasi sederhana:
Dengan menggunakan notasi yang lebih sederhana ini, kita tidak perlu repot tentang perbedaan antara inner dan cross joins. Alih-alih dua klausa "ON", ada satu klausa "WHERE" yang berfungsi. Jika Anda mengalami kesulitan dalam menentukan klausa "BERGABUNG" mana "" pergi, tinggalkan notasi "GABUNG" dan gunakan yang lebih sederhana di atas.
Itu tidak curang.
sumber
Saat menulis kueri menggunakan gabungan dalam, catatan akan mengambil dari kedua tabel jika kondisi terpenuhi di kedua tabel, yaitu pencocokan sama persis dari kolom umum di kedua tabel.
Saat menulis kueri menggunakan cross join hasilnya adalah seperti produk cartesian dari tidak ada catatan di kedua tabel. contoh jika table1 berisi 2 record dan table2 berisi 3 record maka hasil dari query adalah 2 * 3 = 6 record.
Jadi jangan pergi untuk bergabung silang sampai Anda membutuhkannya.
sumber
Gabung silang dan gabung dalam adalah sama dengan satu-satunya perbedaan bahwa dalam gabung dalam kita dengan sederhana menyaring beberapa hasil dari produk kartesius
Ini adalah desain data kami di mana kami memutuskan bahwa hanya ada satu kasus bidang yang kami gunakan untuk bergabung. Gabung hanya silang gabung kedua tabel dan dapatkan hanya garis-garis yang menghasilkan ekspresi boolean khusus.
Perhatikan bahwa jika bidang yang kita lakukan Bergabung dengan kita akan menjadi nol di kedua tabel kita akan melewati filter. Terserah kepada kami atau pabrikan basis data untuk menambahkan aturan tambahan untuk menghindari atau mengizinkan nol. Mengikuti dasar-dasar itu hanya gabungan silang diikuti oleh filter.
sumber
Gabungan dalam akan memberikan hasil rekaman yang cocok antara dua tabel di mana sebagai gabungan silang memberi Anda kemungkinan kombinasi antara dua tabel.
sumber
A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}
cross join
bertindak sebagai produk Cartesian A ✖ B = {1,2}, {1,8} ..., {5,2}, {5,8}, {5,5} ..... {3,3} ..., {6,6} .... {8,9} dan mengembalikan set hasil panjang ini ..ketika memprosesnya
inner join
dilakukan melalui produk Cartesian dan memilih pasangan yang cocok .. jika berpikir pasangan ini dipesan sebagai kunci utama dua tabel dan pada pencarian klausa untuk A = B makainner join
pilih {5,5}, {4,4}, {6,6} , {9,9} dan mengembalikan kolom yang diminta pada klausa pilih yang terkait dengan id ini.jika
cross join
pada a = b maka hasilnya sama dengan hasil yang ditetapkaninner join
. dalam hal ini juga digunakaninner join
.sumber
Itu tergantung pada output yang Anda harapkan.
Gabung silang cocok dengan semua baris dalam satu tabel dengan semua baris di tabel lain. Gabungan dalam cocok dengan bidang atau bidang. Jika Anda memiliki satu meja dengan 10 baris dan yang lain dengan 10 baris maka kedua gabungan akan berperilaku berbeda.
Gabung silang akan memiliki 100 baris yang dikembalikan dan mereka tidak akan terkait, hanya apa yang disebut produk Cartesian. Gabungan dalam akan mencocokkan catatan satu sama lain. Dengan asumsi satu memiliki kunci utama dan itu adalah kunci asing yang lain Anda akan mendapatkan 10 baris dikembalikan.
Gabung silang memiliki utilitas umum yang terbatas, tetapi ada untuk kelengkapan dan menjelaskan hasil bergabung dengan tabel tanpa ada hubungan yang ditambahkan ke kueri. Anda dapat menggunakan gabungan silang untuk membuat daftar kombinasi kata atau yang serupa. Gabungan batin di sisi lain adalah gabungan paling umum.
sumber