SQL Server: Apa perbedaan antara CROSS JOIN dan FULL OUTER JOIN?


194

Apa perbedaan antara CROSS JOIN dan FULL OUTER JOIN di SQL Server?

Apakah mereka sama, atau tidak? Tolong jelaskan. Kapan seseorang akan menggunakan salah satu dari ini?

Jawaban:


243

Gabung silang menghasilkan produk kartesius di antara kedua tabel, mengembalikan semua kemungkinan kombinasi dari semua baris. Tidak adaon klausa karena Anda hanya menggabungkan segalanya untuk segalanya.

A full outer joinadalah kombinasi dari a left outerdan right outergabung. Ini mengembalikan semua baris di kedua tabel yang cocok dengan whereklausa kueri , dan dalam kasus di mana onkondisi tidak dapat dipenuhi untuk baris yang diletakkannyanull nilai dalam bidang yang tidak dihuni.

Ini wikipedia artikel menjelaskan berbagai jenis bergabung dengan contoh-contoh output diberikan satu set sampel tabel.


Maka dalam hal tabel besar FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id akan selalu lebih cepat daripada FROM t1,t2 WHERE t1.id=t2.id?
alexkovelsky

@alexkovelsky joins dalam sering lebih cepat ketika ada beberapa pertandingan antara dua tabel, karena penggunaan indeks berarti tidak repot membaca semua baris di salah satu tabel. gabungan luar penuh harus selalu membaca semua baris di kedua tabel (atau indeks yang relevan). Dalam kasus di mana indeks tidak cukup, atau tumpukan yang mendasarinya harus dibaca untuk menampilkan kolom yang dibutuhkan maka sambungan luar penuh hampir selalu lebih lambat daripada sambungan dalam.
Andrew Hill

1
Lebih outer joincepat atau lebih cross join?
Shafizadeh

2
@ Shafizadeh - Mereka melakukan hal yang berbeda.
Donnie

9
Bagaimana jika saya FULL OUTER GABUNG di True? apakah hasil / kinerja akan serupa dengan CROSS JOIN?
architectonic

65

Satu hal yang mungkin tidak selalu jelas bagi sebagian orang adalah bahwa gabungan silang dengan tabel kosong (atau set hasil) menghasilkan tabel kosong (M x N; maka M x 0 = 0)

Gabungan luar penuh akan selalu memiliki baris kecuali jika M dan N adalah 0.


32

Saya ingin menambahkan satu aspek penting ke jawaban lain, yang sebenarnya menjelaskan topik ini kepada saya dengan cara terbaik:

Jika 2 tabel gabungan berisi baris M dan N, maka join silang akan selalu menghasilkan baris (M x N), tetapi join luar penuh akan menghasilkan dari baris MAX (M, N) hingga (M + N) (tergantung pada berapa banyak baris yang sebenarnya cocok dengan predikat "on").

EDIT:

Dari perspektif pemrosesan query logis, CROSS JOIN memang selalu menghasilkan baris M x N. Apa yang terjadi dengan FULL OUTER JOIN adalah bahwa tabel kiri dan kanan "dipertahankan", seolah-olah gabungan KIRI dan KANAN terjadi. Jadi baris, tidak memuaskan predikat ON, dari tabel kiri dan kanan ditambahkan ke set hasil.


2
Apakah batasan tersebut tidak termasuk kemungkinan 1-banyak pertandingan? Gabung luar penuh masih mampu menghasilkan baris (M x N).
Maxwellb

1
pilih COUNT_BIG (*) DARI Lalu Lintas t CROSS BERGABUNG Penerima r dan SELECT COUNT_BIG (*) DARI Lalu Lintas t PENUH BERGABUNG Penerima r AKTIF (1 = 1) keduanya sama.
urlreader

2
Milikmu adalah jawaban nyata terbaik. Pada dasarnya: a cross joinmengalikan tabel; a full outer joinmenambahkan mereka dalam kasus terburuk, tergantung pada berapa banyak baris yang cocok ..
Brian Peterson

Ya .. Saya mencari matematika ini - menghasilkan dari baris MAX (M, N) hingga (M + N) .. Terima kasih telah memilih.
Arup Rakshit

1
Ini salah. Baris JOIN ON PENUH adalah INNER JOIN ON rows UNION SEMUA baris tabel kiri yang tak tertandingi null-extended UNION SEMUA baris tabel kanan yang tidak tertandingi null-extended. Jadi FULL JOIN dapat mengembalikan baris M * N - mungkin lebih besar dari MAX (M, N) & M + N. Tapi toh jumlah min & max baris yang dikembalikan sebagai fungsi M&N tidak berguna . Apa yang berguna adalah definisi yang jelas tentang FULL JOIN ON --dalam istilah INNER JOIN ON & baris yang tidak cocok.
philipxy

15

Cross join: Cross Joins menghasilkan hasil yang terdiri dari setiap kombinasi baris dari dua tabel atau lebih. Itu berarti jika tabel A memiliki 3 baris dan tabel B memiliki 2 baris, CROSS JOIN akan menghasilkan 6 baris. Tidak ada hubungan yang dibangun antara dua tabel - Anda benar-benar hanya menghasilkan setiap kombinasi yang mungkin.

Full outer Join: A FULL OUTER JOIN bukan "kiri" atau "kanan" - keduanya! Ini termasuk semua baris dari kedua tabel atau set hasil yang berpartisipasi dalam GABUNG. Saat tidak ada baris yang cocok untuk baris di sisi "kiri" dari JOIN, Anda melihat nilai Null dari hasil yang ditetapkan di "kanan." Sebaliknya, ketika tidak ada baris yang cocok untuk baris di sisi "kanan" dari JOIN, Anda melihat nilai Null dari hasil yang ditetapkan di "kiri."


15

Untuk SQL Server, CROSS JOIN and FULL OUTER JOINberbeda. CROSS JOINhanyalah Produk Cartesian dari dua tabel, terlepas dari kriteria filter apa pun atau kondisi apa pun.

FULL OUTER JOINmemberikan hasil yang unik LEFT OUTER JOIN and RIGHT OUTER JOINdari dua tabel. Ini juga membutuhkan klausa ON untuk memetakan dua kolom tabel.

Tabel 1 berisi 10 baris dan Tabel 2 berisi 20 baris dengan 5 baris yang cocok pada kolom tertentu.

Kemudian CROSS JOINakan mengembalikan 10 * 20 = 200 baris dalam hasil yang ditetapkan.

FULL OUTER JOIN akan mengembalikan 25 baris dalam hasil yang ditetapkan.

FULL OUTER JOIN(atau GABUNGAN lainnya) selalu mengembalikan hasil yang disetel dengan kurang dari atau sama dengan Cartesian Product number.

Jumlah baris yang dikembalikan FULL OUTER JOINsama dengan (Jumlah Baris per LEFT OUTER JOIN) + (Jumlah Baris per RIGHT OUTER JOIN) - (Jumlah Baris per INNER JOIN).


8

Mereka adalah konsep yang sama, terlepas dari nilai NULL yang dikembalikan.

Lihat di bawah:

declare @table1 table( col1 int, col2 int );
insert into @table1 select 1, 11 union all select 2, 22;

declare @table2 table ( col1 int, col2 int );
insert into @table2 select 10, 101 union all select 2, 202;

select
    t1.*,
    t2.*
from @table1 t1
full outer join @table2 t2 on t1.col1 = t2.col1
order by t1.col1, t2.col1;

/* full outer join
col1        col2        col1        col2
----------- ----------- ----------- -----------
NULL        NULL        10          101
1           11          NULL        NULL
2           22          2           202
*/

select
    t1.*,
    t2.*
from @table1 t1
cross join @table2 t2
order by t1.col1, t2.col1;

/* cross join
col1        col2        col1        col2
----------- ----------- ----------- -----------
1           11          2           202
1           11          10          101
2           22          2           202
2           22          10          101
*/

1
Contoh bagus!
Lucas925

1
terima kasih atas contoh data nyata. itu membuatnya lebih jelas.
dtc


2

Gabungan luar penuh menggabungkan gabungan luar kiri dan gabungan luar kanan. Set hasil mengembalikan baris dari kedua tabel di mana kondisi terpenuhi tetapi mengembalikan kolom nol di mana tidak ada kecocokan.

Cross join adalah produk Cartesian yang tidak memerlukan persyaratan apa pun untuk bergabung dengan tabel. Set hasil berisi baris dan kolom yang merupakan perkalian dari kedua tabel.


1

Berikut adalah contoh di mana FULL OUTER JOIN dan CROSS JOIN mengembalikan hasil yang sama tanpa NULL. Harap perhatikan 1 = 1 pada klausa ON untuk FULL OUTER JOIN:

declare @table1 table (     col1    int,    col2    int ) 
declare @table2 table (     col1    int,    col2    int )

insert into @table1 select  1, 11   union all select    2, 22   

insert into @table2 select  10, 101 union all select     2, 202

select  *
from    @table1 t1 full outer join @table2 t2
    on  1 = 1
(2 baris terpengaruh)

(2 baris terpengaruh)
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202
select  *
from    @table1 t1 cross join @table2 t2
col1 col2 col1 col2
----------- ----------- ----------- -----------
1 11 10 101
2 22 10 101
1 11 2 202
2 22 2 202

(4 baris terpengaruh)

1

SQL FULL OUTER BERGABUNG

  • FULL OUTER JOIN mengembalikan semua baris dari tabel kiri (table1) dan dari tabel kanan (table2) terlepas dari pertandingan.

  • Kata kunci FULL OUTER JOIN menggabungkan hasil dari kedua LEFT OUTER JOIN dan RIGHT OUTER JOIN

  • SQL full outer join juga dikenal sebagai FULL JOIN

Referensi: http://datasciencemadesimple.com/sql-full-outer-join/

SQL CROSS BERGABUNG

  • Dalam SQL CROSS JOIN Setiap baris dari tabel pertama dipetakan dengan masing-masing dan setiap baris dari tabel kedua.

  • Jumlah baris yang dihasilkan oleh himpunan hasil operasi CROSS JOIN sama dengan jumlah baris di tabel pertama dikalikan dengan jumlah baris di tabel kedua.

  • CROSS JOIN juga dikenal sebagai produk Cartesian / Cartesian join

  • Jumlah baris dalam tabel A adalah m, Jumlah baris dalam tabel B adalah n dan tabel yang dihasilkan akan memiliki m * n baris

Referensi: http://datasciencemadesimple.com/sql-cross-join/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.