CROSS JOIN đang được chú ý. Bài viết này kết thúc loạt ấn phẩm nhỏ liên quan đến SQL JOIN của chúng tôi. Nếu bạn bỏ lỡ hai bài viết trước, hãy tham khảo chúng như sau:
- Hướng dẫn cơ bản của bạn về tham gia SQL - Phần 1:INNER JOIN
- Hướng dẫn Cơ bản về Tham gia SQL - Phần 2:THAM GIA NGOÀI TRỜI
SQL Server CROSS JOIN là phép nối đơn giản nhất trong số các phép nối. Nó thực hiện sự kết hợp của 2 bảng mà không có điều kiện nối. Nếu bạn có 5 hàng trong một bảng và 3 hàng trong bảng khác, bạn sẽ có 15 kết hợp. Một định nghĩa khác là Sản phẩm Descartes.
Bây giờ, tại sao bạn muốn kết hợp các bảng mà không có điều kiện nối? Chờ một chút vì chúng tôi đang đến đó. Đầu tiên, hãy tham khảo cú pháp.
Cú pháp CROSS JOIN trong SQL
Giống như với INNER JOIN, bạn có thể có CROSS JOIN từ 2 tiêu chuẩn, SQL-92 và SQL-89. T-SQL hỗ trợ cả hai cú pháp, nhưng tôi thích SQL-92 hơn. Hãy xem phần 1 dành riêng cho INNER JOIN nếu bạn muốn biết lý do.
Cú pháp SQL-92
SELECT
a.column1
,b.column2
FROM Table1 a
CROSS JOIN Table2 b
SQL-89
SELECT
a.column1
,b.column2
FROM Table1 a, Table2 b
Giống như SQL-89 - INNER JOIN không có điều kiện tham gia.
5 Ví dụ về Sử dụng SQL Server CROSS JOIN
Bạn có thể tự hỏi khi nào bạn có thể sử dụng SQL CROSS JOIN. Tất nhiên, nó hữu ích cho việc định hình các kết hợp giá trị. Còn gì nữa?
1. Dữ liệu thử nghiệm
Nếu bạn cần một lượng lớn dữ liệu, CROSS JOIN sẽ giúp bạn. Ví dụ:bạn có một bảng các nhà cung cấp và sản phẩm. Một bảng khác chứa các sản phẩm mà nhà cung cấp cung cấp. Nếu nó trống và bạn cần dữ liệu nhanh chóng, đây là những gì bạn có thể làm:
SELECT
P.ProductID
,v.BusinessEntityID AS VendorID
FROM
Production.Product p
CROSS JOIN Purchasing.Vendor v
Nó đã tạo ra 52.416 bản ghi trong bản sao AdventureWorks của tôi . Điều đó đủ để kiểm tra các ứng dụng và hiệu suất. Tuy nhiên, nếu bạn giới thiệu ứng dụng của mình cho người dùng, hãy sử dụng nguồn của bạn thay vì dữ liệu này từ ví dụ của chúng tôi.
2. Nhận kết quả từ các kết hợp bị thiếu
Trong bài viết trước, chúng tôi đã minh họa cách sử dụng OUTER JOIN để nhận kết quả từ các giá trị bị thiếu. Lần này, chúng tôi sẽ sử dụng các kết hợp còn thiếu. Hãy thử mua những sản phẩm mà Cửa hàng 294 không kiếm được tiền.
-- get store 294 ('Professional Sales and Service') list of products without sales orders for January 2014
SELECT DISTINCT
b.Name AS Product
FROM Sales.Store a
CROSS JOIN Production.Product b
LEFT JOIN (SELECT
c.StoreID
,a.ProductID
,SUM(a.LineTotal) AS OrderTotal
FROM Sales.SalesOrderDetail a
INNER JOIN Sales.SalesOrderHeader b ON a.SalesOrderID = b.SalesOrderID
INNER JOIN Sales.Customer c ON b.CustomerID = c.CustomerID
WHERE c.StoreID = 294 AND
b.OrderDate BETWEEN '01/01/2014' AND '01/31/2014'
GROUP BY c.StoreID, a.ProductID) d ON a.BusinessEntityID = d.StoreID
AND b.ProductID = d.ProductID
WHERE d.OrderTotal IS NULL
AND a.BusinessEntityID = 294
ORDER BY b.Name
Như bạn có thể thấy, trước tiên chúng tôi cần tất cả các kết hợp sản phẩm và cửa hàng - chúng tôi sử dụng CROSS JOIN. Sau đó, chúng tôi cần danh sách các sản phẩm được bán trong khoảng thời gian tháng 1 năm 2014. Cuối cùng, áp dụng LEFT JOIN vào danh sách đó và sử dụng mệnh đề WHERE để chỉ nhận các sản phẩm không có doanh số bán hàng. Sau đó, chúng tôi nhận được thông tin về các sản phẩm chưa được bán.
3. Hình thành Từ từ Kết hợp Chữ cái
Nếu bạn thích trò chơi chữ với các tổ hợp chữ cái, bạn có thể sử dụng CROSS JOIN với cách tự tham gia. Đây là một ví dụ sử dụng 3 chữ cái ‘D’, ‘O’ và ‘G’.
DECLARE @table TABLE(letter CHAR(1) NOT NULL)
INSERT INTO @table
VALUES ('D'),('O'),('G')
SELECT
a.letter
,b.letter
,c.letter
FROM @table a
CROSS JOIN @table b
CROSS JOIN @table c
WHERE a.letter + b.letter + c.letter LIKE '%O%'
Một mã tương tự không có mệnh đề WHERE sẽ tạo ra 27 bản ghi. Mệnh đề WHERE ở trên đã giúp loại bỏ các kết hợp gồm 3 tổ hợp chữ cái giống nhau như ‘DDD’ hoặc ‘GGG’. Dưới đây là kết quả.
Tất nhiên, vì tôi không đặt nhiều thông tin vào truy vấn, nên hầu hết các kết quả đều không có từ. Tuy nhiên, nó giúp ích cho phần tư duy của trò chơi.
4. Gợi ý bữa ăn
Tất cả chúng ta đều yêu thích đồ ăn, nhưng thật khó để chọn được sự kết hợp phù hợp. Như trong các khái niệm ví dụ trước, đây là cách để có được các kết hợp bữa ăn khả thi:
DECLARE @FoodMenu TABLE(FoodItem VARCHAR(50) NOT NULL, ItemType CHAR(1) NOT NULL)
-- main course
INSERT INTO @FoodMenu
VALUES
('Spaghetti with Meatballs','M'),
('Spaghetti with Fried Chicken','M'),
('Rice with Roasted Chicken','M')
-- side dish
INSERT INTO @FoodMenu
VALUES
('Buttered Corn and Carrots','S'),
('French Fries','S'),
('Vegetable Coleslaw','S')
-- drinks
INSERT INTO @FoodMenu
VALUES
('Orange Juice','D'),
('Pineapple Juice','D'),
('Soda','D')
SELECT
a.FoodItem AS MainCourse
,b.FoodItem AS SideDish
,c.FoodItem AS Drinks
FROM @FoodMenu a
CROSS JOIN @FoodMenu b
CROSS JOIN @FoodMenu c
WHERE a.ItemType = 'M' AND
b.ItemType = 'S' AND
c.ItemType = 'D'
Kết quả:
Một số người trong số họ là mong muốn. Một số kiểu như, ‘quên nó đi!’ Điều đó tùy thuộc vào sở thích của bạn.
5. Lựa chọn thiết kế áo phông
Một cách sử dụng có thể có khác của CROSS JOIN là nhận các kết hợp thiết kế cho áo sơ mi. Đây là mã mẫu:
DECLARE @tshirts TABLE(attributeType CHAR(1) NOT NULL, Attribute VARCHAR(15))
--size
INSERT INTO @tshirts
VALUES
('S','Small'),
('S','Medium'),
('S','Large')
--color
INSERT INTO @tshirts
VALUES
('C','Red'),
('C','Blue'),
('C','Green'),
('C','Black'),
('C','Purple'),
('C','Yellow'),
('C','White')
--design
INSERT INTO @tshirts
VALUES
('D','Plain'),
('D','Printed')
SELECT
a.Attribute AS Size
,b.Attribute AS Color
,c.Attribute AS Design
FROM @tshirts a
CROSS JOIN @tshirts b
CROSS JOIN @tshirts c
WHERE a.attributeType = 'S' AND
b.attributeType = 'C' AND
c.attributeType = 'D'
Và kết quả? Hãy xem phần của nó trong Hình 3:
Bạn có thể nghĩ thêm một số ví dụ không?
Hiệu suất CROSS JOIN của Máy chủ SQL
Lợi ích khi sử dụng CROSS JOIN là gì? Đối với những gì đáng giá, CROSS JOIN có thể gây ra các vấn đề về hiệu suất nếu bạn không cẩn thận. Phần đáng sợ nhất là, nó tạo thành một sản phẩm của 2 bộ. Do đó, không giới hạn kết quả trong mệnh đề WHERE, Bảng1 với 1000 bản ghi CROSS JOIN với Table2 với 1.000.000 hồ sơ sẽ trở thành 1.000.000.000 hồ sơ. Do đó, SQL Server phải đọc rất nhiều trang.
Ví dụ:hãy xem xét việc ghép đôi nhân viên nam và nhân viên nữ trong AdventureWorks .
USE AdventureWorks
GO
SELECT
P.LastName + ISNULL(' ' + p.Suffix,'') + ', ' + P.FirstName + ISNULL(' ' + P.MiddleName,'') AS Male
,P1.LastName + ISNULL(' ' + p1.Suffix,'') + ', ' + P1.FirstName + ISNULL(' ' + P1.MiddleName,'') AS Female
FROM HumanResources.Employee e
INNER JOIN Person.Person p ON e.BusinessEntityID = P.BusinessEntityID
CROSS JOIN HumanResources.Employee e1
INNER JOIN Person.Person p1 ON e1.BusinessEntityID = p1.BusinessEntityID
WHERE e.Gender = 'M'
AND e1.Gender = 'F'
Đoạn mã trên cung cấp cho bạn tất cả các cặp nhân viên nam và nữ có thể có. Tôi chỉ nhận được 17.304 bản ghi, nhưng hãy nhìn vào các lần đọc logic trong Hình 4:
Bạn có thấy cách đọc hợp lý của Người bàn? Đó là đọc 53.268 x 8KB trang! Chưa kể đến WorkTable đọc logic được thực hiện trong tempdb .
Kết luận? Kiểm tra IO THỐNG KÊ, và nếu bạn khó thấy các lần đọc logic lớn, hãy diễn đạt một truy vấn theo cách khác. Các điều kiện bổ sung trong mệnh đề WHERE hoặc cách tiếp cận chia để trị có thể hữu ích.
Khi THAM GIA CROSS trở thành THAM GIA BÊN TRONG
Vâng đúng vậy. SQL Server có thể xử lý CROSS JOIN dưới dạng INNER JOIN. Chúng tôi đã đề cập trước đó rằng khi một THAM GIA PHẢI được xử lý như một THAM GIA TRÁI, nó có thể áp dụng cho THAM GIA CHÉO. Hãy xem đoạn mã dưới đây:
SELECT
c.CustomerID
,c.AccountNumber
,P.BusinessEntityID
,P.LastName
,P.FirstName
FROM Sales.Customer c
CROSS JOIN Person.Person p
WHERE c.PersonID = P.BusinessEntityID
Trước khi chúng tôi kiểm tra Kế hoạch thực thi, hãy có INNER JOIN tương đương.
SELECT
c.CustomerID
,c.AccountNumber
,P.BusinessEntityID
,P.LastName
,P.FirstName
FROM Sales.Customer c
INNER JOIN Person.Person p ON c.PersonID = P.BusinessEntityID
Bây giờ, hãy kiểm tra Kế hoạch thực thi bên dưới.
Kế hoạch hàng đầu là truy vấn sử dụng CROSS JOIN. Kế hoạch dưới cùng là truy vấn sử dụng INNER JOIN. Họ có cùng một QueryHashPlan .
Bạn có nhận thấy Kết hợp băm nhà điều hành của kế hoạch hàng đầu? Đó là THAM GIA BÊN TRONG. Nhưng chúng tôi đã sử dụng CROSS JOIN trong mã. Mệnh đề WHERE trong truy vấn đầu tiên ( WHERE c.PersonID =P.BusinessEntityID ) buộc các kết quả chỉ có các tổ hợp với các phím bằng nhau. Vì vậy, về mặt logic, đó là THAM GIA BÊN TRONG.
Cái nào tốt hơn? Đó là sự lựa chọn cá nhân của bạn. Tôi thích INNER JOIN hơn vì mục đích là tham gia 2 bảng với các khóa bằng nhau. Việc sử dụng INNER JOIN sẽ làm cho nó trở nên rất rõ ràng. Nhưng đó chỉ là tôi.
Kết luận
CROSS JOIN rất phù hợp để cung cấp cho bạn tất cả các kết hợp giá trị có thể có. Tuy nhiên, bạn đã được cảnh báo rằng nó có thể gây ra một số loại "bùng nổ" dữ liệu. Sử dụng THAM GIA này một cách cẩn thận. Giới hạn kết quả nhiều nhất có thể. Ngoài ra, bạn có thể viết CROSS JOIN có chức năng tương đương với INNER JOIN.
Bài viết này kết thúc loạt bài về SQL JOINs. Để tham khảo trong tương lai, bạn có thể đánh dấu bài viết này. Hoặc thêm nó vào bộ sưu tập của bạn trong trình duyệt.
Và đừng quên chia sẻ bài viết này trên phương tiện truyền thông xã hội yêu thích của bạn?