SQL Server: Sự khác biệt giữa CROSS THAM GIA và FULL OUTER THAM GIA là gì?


194

Sự khác biệt giữa CROSS THAM GIA và FULL OUTER THAM GIA trong SQL Server là gì?

Họ có giống nhau hay không? Vui lòng giải thích. Khi nào thì người ta sẽ sử dụng một trong hai?

Câu trả lời:


243

Một phép nối chéo tạo ra một sản phẩm cartesian giữa hai bảng, trả về tất cả các kết hợp có thể có của tất cả các hàng. Nó không có onđiều khoản bởi vì bạn chỉ cần tham gia mọi thứ với mọi thứ.

A full outer joinlà sự kết hợp của a left outerright outertham gia. Nó trả về tất cả các hàng trong cả hai bảng khớp với wheremệnh đề của truy vấn và trong trường hợp onđiều kiện không thể thỏa mãn cho các hàng đó, nó đặt nullcác giá trị cho các trường không được điền.

Bài viết trên wikipedia này giải thích các loại liên kết khác nhau với các ví dụ về đầu ra được cung cấp một tập hợp các bảng mẫu.


Vậy thì trong trường hợp bàn lớn FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id sẽ luôn nhanh hơn FROM t1,t2 WHERE t1.id=t2.id?
alexkovelsky

Các phép nối bên trong @alexkovelsky thường nhanh hơn khi có một vài kết quả khớp giữa hai bảng, vì việc sử dụng các chỉ mục có nghĩa là nó không bận tâm đến việc đọc tất cả các hàng trên một trong các bảng. một tham gia bên ngoài đầy đủ phải luôn luôn đọc tất cả các hàng trong cả hai bảng (hoặc các chỉ mục có liên quan). Trong trường hợp chỉ mục không đủ hoặc phải đọc một đống cơ sở để xuất ra các cột cần thiết thì một liên kết ngoài đầy đủ hầu như luôn chậm hơn so với nối bên trong.
Andrew Hill

1
outer joinnhanh hơn hay cross join?
Shafizadeh

2
@Shafizadeh - Họ làm những việc khác nhau.
Donnie

9
Điều gì xảy ra nếu tôi HOÀN TOÀN THAM GIA trên True? kết quả / hiệu suất sẽ tương tự như một CROSS THAM GIA?
kiến trúc sư

65

Một điều có thể không phải lúc nào cũng rõ ràng đối với một số người là tham gia chéo với một bảng trống (hoặc tập kết quả) dẫn đến bảng trống (M x N; do đó M x 0 = 0)

Một phép nối ngoài đầy đủ sẽ luôn có các hàng trừ khi cả M và N đều bằng 0.


32

Tôi muốn thêm một khía cạnh quan trọng vào các câu trả lời khác, điều này thực sự giải thích chủ đề này cho tôi theo cách tốt nhất:

Nếu 2 bảng được nối chứa hàng M và N, thì phép nối chéo sẽ luôn tạo ra các hàng (M x N), nhưng phép nối ngoài đầy đủ sẽ tạo ra từ hàng MAX (M, N) đến (M + N) (tùy thuộc vào số lượng hàng thực sự khớp vị ngữ "trên").

BIÊN TẬP:

Từ quan điểm xử lý truy vấn logic, CROSS THAM GIA thực sự luôn tạo ra các hàng M x N. Điều xảy ra với FULL OUTER THAM GIA là cả hai bảng bên trái và bên phải đều được "bảo tồn", như thể cả hai tham gia TRÁI và PHẢI đã xảy ra. Vì vậy, các hàng, không thỏa mãn vị từ ON, từ cả hai bảng bên trái và bên phải được thêm vào tập kết quả.


2
Là những giới hạn không bao gồm 1-nhiều trận đấu có thể? Một liên kết ngoài đầy đủ vẫn có khả năng tạo ra các hàng (M x N).
maxwellb

1
chọn COUNT_BIG (*) TỪ Lưu lượng truy cập t CROSS THAM GIA Người nhận r và CHỌN COUNT_BIG (*) TỪ Lưu lượng truy cập T FULL THAM GIA Người nhận r ON (1 = 1) chúng giống nhau.
urlreader

2
Bạn là câu trả lời thực sự tốt nhất. Về cơ bản: cross joinbội số các bảng; a full outer jointhêm chúng trong trường hợp xấu nhất, tùy thuộc vào số lượng hàng khớp với nhau ..
Brian Peterson

Có .. Tôi đã tìm kiếm toán học này - sản xuất từ ​​các hàng MAX (M, N) đến (M + N) .. Cảm ơn đã bình chọn.
Arup Rakshit

1
Cái này sai. THAM GIA ĐẦY ĐỦ trên các hàng được THAM GIA VÀO các hàng UNION TẤT CẢ các hàng của bảng bên trái chưa được mở rộng UNION TẤT CẢ các hàng của bảng bên phải chưa được mở rộng. Vì vậy, FULL THAM GIA có thể trả về các hàng M * N - có thể lớn hơn cả MAX (M, N) & M + N. Nhưng dù sao số lượng hàng tối thiểu và tối đa được trả về là một hàm của M & N chỉ không hữu ích . Điều hữu ích là một định nghĩa rõ ràng về FULL THAM GIA TRÊN - trong các điều khoản của INNER THAM GIA VÀ các hàng chưa từng có.
philipxy

15

Tham gia chéo: Tham gia chéo tạo ra kết quả bao gồm mọi kết hợp các hàng từ hai hoặc nhiều bảng. Điều đó có nghĩa là nếu bảng A có 3 hàng và bảng B có 2 hàng, thì CROSS THAM GIA sẽ có 6 hàng. Không có mối quan hệ nào được thiết lập giữa hai bảng - bạn thực sự chỉ tạo ra mọi sự kết hợp có thể.

Tham gia đầy đủ bên ngoài: THAM GIA FULL OUTER không phải là "trái" hay "phải" - đó là cả hai! Nó bao gồm tất cả các hàng từ cả hai bảng hoặc tập kết quả tham gia THAM GIA. Khi không có hàng phù hợp tồn tại cho các hàng ở phía "bên trái" của THAM GIA, bạn sẽ thấy các giá trị Null từ kết quả được đặt ở "bên phải". Ngược lại, khi không có hàng khớp nào tồn tại cho các hàng ở phía "bên phải" của THAM GIA, bạn sẽ thấy các giá trị Null từ tập kết quả ở "bên trái".


15

Đối với SQL Server, CROSS JOIN and FULL OUTER JOINthì khác. CROSS JOINchỉ đơn giản là Sản phẩm của Cartesian gồm hai bảng, không phân biệt bất kỳ tiêu chí lọc hay bất kỳ điều kiện nào.

FULL OUTER JOINđưa ra tập kết quả duy nhất LEFT OUTER JOIN and RIGHT OUTER JOINcủa hai bảng. Nó cũng cần mệnh đề ON để ánh xạ hai cột của bảng.

Bảng 1 chứa 10 hàng và Bảng 2 chứa 20 hàng với 5 hàng khớp với các cột cụ thể.

Sau đó CROSS JOINsẽ trả về 10 * 20 = 200 hàng trong tập kết quả.

FULL OUTER JOIN sẽ trả về 25 hàng trong tập kết quả.

FULL OUTER JOIN(hoặc bất kỳ THAM GIA nào khác) luôn trả về kết quả được đặt nhỏ hơn hoặc bằng Cartesian Product number.

Số lượng hàng được trả về FULL OUTER JOINbằng (Số hàng theo LEFT OUTER JOIN) + (Số hàng theo RIGHT OUTER JOIN) - (Số hàng theo INNER JOIN).


8

Chúng là các khái niệm giống nhau, ngoài giá trị NULL được trả về.

Xem bên dưới:

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
Ví dụ tuyệt vời!
Lucas925

1
cảm ơn ví dụ dữ liệu thực tế Điều đó làm cho nó rõ ràng hơn.
dtc


2

Một kết nối bên ngoài đầy đủ kết hợp một tham gia bên ngoài bên trái và tham gia bên ngoài bên phải. Tập kết quả trả về các hàng từ cả hai bảng trong đó các điều kiện được đáp ứng nhưng trả về các cột null khi không có kết quả khớp.

Tham gia chéo là một sản phẩm của Cartesian không yêu cầu bất kỳ điều kiện nào để tham gia các bảng. Tập kết quả chứa các hàng và cột là phép nhân của cả hai bảng.


1

Dưới đây là một ví dụ trong đó cả FULL OUTER THAM GIA và CROSS THAM GIA trả về cùng một tập kết quả mà không trả về NULL. Vui lòng lưu ý 1 = 1 trong mệnh đề BẬT cho FULL OUTER THAM GIA:

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 hàng bị ảnh hưởng)

(2 hàng bị ảnh hưởng)
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 hàng bị ảnh hưởng)

1

SQL FULL OUTER THAM GIA

  • FULL OUTER THAM GIA trả về tất cả các hàng từ bảng bên trái (bảng1) và từ bảng bên phải (bảng2) không phân biệt trận đấu.

  • Từ khóa FULL OUTER THAM GIA kết hợp kết quả của cả LEFT OUTER THAM GIA và RIGHT OUTER THAM GIA

  • SQL đầy đủ tham gia bên ngoài còn được gọi là FULL THAM GIA

Tham khảo: http://datasciencemadesimple.com/sql-full-outer-join/

SQL CROSS THAM GIA

  • Trong SQL CROSS THAM GIA Mỗi hàng của bảng đầu tiên được ánh xạ với mỗi và mỗi hàng của bảng thứ hai.

  • Số lượng hàng được tạo bởi một tập kết quả của hoạt động CROSS THAM GIA bằng số lượng hàng trong bảng đầu tiên nhân với số lượng hàng trong bảng thứ hai.

  • CROSS THAM GIA còn được gọi là sản phẩm của Cartesian / Cartesian tham gia

  • Số hàng trong bảng A là m, Số hàng trong bảng B là n và bảng kết quả sẽ có m * n hàng

Tham khảo: http://datasciencemadesimple.com/sql-cross-join/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.