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?
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:
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 join
là sự kết hợp của a left outer
và right outer
tham gia. Nó trả về tất cả các hàng trong cả hai bảng khớp với where
mệ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 null
cá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.
outer join
nhanh hơn hay cross join
?
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.
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ả.
cross join
bội số các bảng; a full outer join
thê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 ..
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".
Đối với SQL Server, CROSS JOIN and FULL OUTER JOIN
thì khác.
CROSS JOIN
chỉ đơ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 JOIN
củ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 JOIN
sẽ 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ằngCartesian Product number
.Số lượng hàng được trả về
FULL OUTER JOIN
bằng (Số hàng theoLEFT OUTER JOIN
) + (Số hàng theoRIGHT OUTER JOIN
) - (Số hàng theoINNER JOIN
).
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
*/
Tham gia chéo : http://www.dba-oracle.com/t_garmany_9_sql_cross_join.htm
TLDR; Tạo ra tất cả các kết hợp có thể có giữa 2 bảng (sản phẩm Carthesian)
(Đầy đủ) Tham gia ngoài : http://www.w3schools.com/Sql/sql_join_full.asp
TLDR; Trả về mỗi hàng trong cả hai bảng và cũng có kết quả có cùng giá trị (khớp trong ĐIỀU KIỆN)
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.
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)
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
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
FROM t1 FULL OUTER JOIN t2 ON t1.id=t2.id
sẽ luôn nhanh hơnFROM t1,t2 WHERE t1.id=t2.id
?