THAM GIA CROSS = (INNER) THAM GIA = dấu phẩy (",")
TL; DR Sự khác biệt duy nhất giữa SQL CROSS THAM GIA, (INNER) THAM GIA và dấu phẩy (",") (bên cạnh dấu phẩy có mức độ ưu tiên thấp hơn cho thứ tự đánh giá) là (INNER) THAM GIA có BẬT trong khi CROSS THAM GIA và dấu phẩy không.
Re sản phẩm trung gian
Cả ba đều tạo ra một sản phẩm "Cartesian" quan hệ theo kiểu khái niệm trung gian, hay còn gọi là nối chéo, của tất cả các kết hợp có thể có của một hàng từ mỗi bảng. Đó là ON và / hoặc WHERE làm giảm số lượng hàng. Câu đố SQL
Tiêu chuẩn SQL định nghĩa <dấu phẩy> qua sản phẩm (7.5 1.b.ii), <tham gia chéo> qua <dấu phẩy> (7.7 1.a) và THAM GIA <điều kiện tìm kiếm> qua <dấu phẩy> cộng với WHERE (7.7 1.b ).
Như Wikipedia đưa ra:
Tham gia chéo
CROSS THAM GIA trả về sản phẩm Cartesian của các hàng từ các bảng trong phép nối. Nói cách khác, nó sẽ tạo ra các hàng kết hợp mỗi hàng từ bảng đầu tiên với mỗi hàng từ bảng thứ hai.
Tham gia nội bộ
[...] Kết quả của phép nối có thể được định nghĩa là kết quả của lần đầu tiên lấy sản phẩm Cartesian (hoặc nối chéo) của tất cả các bản ghi trong bảng (kết hợp mọi bản ghi trong bảng A với mọi bản ghi trong bảng B) và sau đó trả về tất cả các hồ sơ thỏa mãn vị ngữ tham gia.
"Ký hiệu liên kết ngầm" chỉ liệt kê các bảng để tham gia, trong mệnh đề TỪ của câu lệnh SELECT, sử dụng dấu phẩy để phân tách chúng. Do đó, nó chỉ định tham gia chéo
Re OUTER THAM GIA và sử dụng ON vs WHERE trong đó, xem Điều kiện trong LEFT THAM GIA (OUTER THAM GIA) so với INNER THAM GIA .
Tại sao so sánh các cột giữa các bảng?
Khi không có hàng trùng lặp:
Mỗi bảng chứa các hàng tạo ra một tuyên bố đúng từ một mẫu câu lệnh điền vào chỗ trống [có tên-] nhất định. (Nó làm cho một mệnh đề thực sự từ-- thỏa mãn - một vị ngữ (đặc trưng) nhất định .)
Một bảng cơ sở chứa các hàng tạo ra một tuyên bố đúng từ một số mẫu câu lệnh do DBA cung cấp:
/* rows where
customer C.CustomerID has age C.Age and ...
*/
FROM Customers C
Sản phẩm trung gian của một phép nối giữ các hàng tạo ra một tuyên bố đúng từ các mẫu AND của toán hạng của nó:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
*/
FROM Customers C CROSS JOIN Movies M
Các điều kiện ON & WHERE được ANDed để đưa ra một mẫu hơn nữa. Giá trị lại là các hàng thỏa mãn mẫu đó:
/* rows where
customer C.CustomerID has age C.Age and ...
AND movie M.Movie is rented by customer M.CustomerID and ...
AND C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
AND C.Age = 18
*/
FROM Customers C INNER JOIN Movies M
ON C.CustomerID = M.CustomerID
AND C.Age >= M.[Minimum Age]
WHERE C.Age = 18
Cụ thể, so sánh các cột cho sự bình đẳng (SQL) giữa các bảng có nghĩa là các hàng được giữ từ sản phẩm từ các phần của bảng đã tham gia của mẫu có cùng giá trị (không phải NULL) cho các cột đó. Thật trùng hợp khi nhiều hàng thường được loại bỏ bằng cách so sánh bằng giữa các bảng - điều cần thiết và đủ là để mô tả các hàng bạn muốn.
Chỉ cần viết SQL cho mẫu cho các hàng bạn muốn!
Ý nghĩa của các truy vấn (và bảng so với điều kiện) xem:
Làm cách nào để lấy dữ liệu khớp từ một bảng SQL khác cho hai cột khác nhau: Tham gia nội bộ và / hoặc Liên minh?
Có quy tắc nào để xây dựng truy vấn SQL từ một mô tả có thể đọc được không?
Quá tải "tham gia chéo"
Thật không may, thuật ngữ "tham gia chéo" được sử dụng cho:
- Các sản phẩm trung gian.
- THAM GIA CROSS.
- (INNER) THAM GIA với một ON hoặc WHERE không so sánh bất kỳ cột nào từ một bảng với bất kỳ cột nào khác. (Vì điều đó có xu hướng trả lại rất nhiều hàng sản phẩm trung gian.)
Những ý nghĩa khác nhau có được bối rối. (Ví dụ như trong các câu trả lời và nhận xét khác ở đây.)
Sử dụng CROSS THAM GIA vs (INNER) THAM GIA vs dấu phẩy
Quy ước chung là:
- Sử dụng CROSS THAM GIA khi và chỉ khi bạn không so sánh các cột giữa các bảng. Điều đó cho thấy rằng việc thiếu so sánh là có chủ ý.
- Sử dụng (INNER) THAM GIA với BẬT khi và chỉ khi bạn so sánh các cột giữa các bảng. (Cộng với các điều kiện khác.)
- Đừng sử dụng dấu phẩy.
Thông thường, các điều kiện không nằm trên các cặp bảng được giữ ở ĐÂU. Nhưng chúng có thể phải được đặt trong (n INNER) THAM GIA để có được các hàng thích hợp cho đối số thành PHẢI, TRÁI hoặc ĐẦY ĐỦ (NGOÀI) THAM GIA.
Re "Không sử dụng dấu phẩy" Trộn dấu phẩy với THAM GIA rõ ràng có thể gây hiểu lầm vì dấu phẩy có mức độ ưu tiên thấp hơn. Nhưng với vai trò của sản phẩm trung gian theo nghĩa của CROSS THAM GIA, (INNER) THAM GIA và dấu phẩy, các đối số cho quy ước ở trên về việc không sử dụng nó hoàn toàn bị lung lay. THAM GIA CROSS hoặc dấu phẩy giống như một THAM GIA (INNER) THAM GIA điều kiện TRUE. Một sản phẩm trung gian, ON và WHERE đều giới thiệu AND trong vị từ tương ứng. Tuy nhiên, có thể nghĩ đến INNER THAM GIA ON - giả sử, chỉ tạo một hàng đầu ra khi tìm một cặp hàng đầu vào thỏa mãn điều kiện BẬT - tuy nhiên nó trả về các hàng nối chéo thỏa mãn điều kiện. Lý do duy nhất ON phải bổ sung dấu phẩy trong SQL là để viết OUTERTHAM GIA. Tất nhiên, một biểu thức nên làm cho ý nghĩa của nó rõ ràng; nhưng những gì rõ ràng phụ thuộc vào những gì được thực hiện có nghĩa là.
Biểu đồ Re Venn Một sơ đồ Venn với hai vòng tròn giao nhau có thể minh họa sự khác biệt giữa các hàng đầu ra cho INNER, LEFT, RIGHT & FULL THAM GIA cho cùng một đầu vào. Và khi BẬT là vô điều kiện, kết quả INNER THAM GIA giống như CROSS THAM GIA. Ngoài ra, nó có thể minh họa các hàng đầu vào và đầu ra cho INTERSECT, UNION & EXCEPT. Và khi cả hai đầu vào có cùng một cột, kết quả INTERSECT giống như đối với SQL NATURAL THAM GIA tiêu chuẩn và kết quả EXCEPT giống như đối với các thành ngữ nhất định liên quan đến LEFT & RIGHT THAM GIA. Nhưng nó không minh họa cách thức (INNER) THAM GIA hoạt động nói chung. Điều đó chỉ có vẻ hợp lý từ cái nhìn đầu tiên . Nó có thể xác định các phần của đầu vào và / hoặc đầu ra chocác trường hợp đặc biệt BẬT, PK (khóa chính), FK (khóa ngoại) và / hoặc CHỌN. Tất cả bạn phải làm để thấy điều này là xác định chính xác các yếu tố của các bộ được đại diện bởi các vòng tròn là gì . (Những bản trình bày bị nhầm lẫn không bao giờ làm rõ.) (Hãy nhớ rằng nói chung đối với các hàng đầu ra của phép nối có các tiêu đề khác nhau từ các hàng đầu vào . Và các bảng SQL là các túi không phải là tập hợp các hàng với NULL .)
CROSS JOIN
sẽ dẫn đến tất cả các kết hợp có thể của các bảng. ví dụ: Bảng 1 có 100 hàng và Bảng 2 có 100 hàng sẽ tạo ra 10000 bản ghi.