Vâng, bạn có thể! Câu trả lời dài hơn là có, có một vài cách để kết hợp hai bảng mà không có cột chung, bao gồm tham gia chéo [sản phẩm Cartesian] và Union. Cái sau về mặt kỹ thuật không phải là một sự tham gia nhưng có thể tiện dụng để hợp nhất các bảng trong SQL. Trong bài viết này, tôi sẽ hướng dẫn bạn thông qua các giải pháp khác nhau với các ví dụ.
Khi nào bạn cần tham gia các bảng mà không có cột chung?
Người mới bắt đầu mới bắt đầu với SQL thường được giới thiệu để tham gia Equi Standard, trong đó hai bảng được kết hợp bởi một cột chung. Tuy nhiên, các nhiệm vụ trong thế giới thực của một nhà phân tích dữ liệu thường đa dạng và phức tạp hơn.
Ví dụ, có nhiều trường hợp sử dụng cho tham gia không cân bằng, khi hai bảng được kết hợp bằng cách sử dụng các toán tử có điều kiện khác với dấu hiệu bằng nhau. Nếu bạn không quen thuộc với loại tham gia này, hãy xem khóa học tham gia SQL tương tác của chúng tôi. Nó cung cấp hơn 90 bài tập thực hành trên các loại tham gia khác nhau, bao gồm tham gia nhiều hơn hai bảng, tham gia không cân bằng, tự tham gia, LEFT JOIN
, FULL JOIN
, và nhiều hơn nữa.
Trong các trường hợp khác, bạn có thể muốn có mọi kết hợp của các hàng từ hai bảng. Ví dụ, nếu bạn điều hành một nhà hàng, bạn có thể muốn xem tất cả các kết hợp rượu vang có thể có từ thẻ rượu vang và các khóa học chính từ thực đơn của bạn.
Hoặc, hãy tưởng tượng rằng thông tin về các nhà cung cấp của bạn được lưu trữ trong các bảng khác nhau. Họ thậm chí có thể có tên cột khác nhau theo loại sản phẩm [tức là, rượu vang, nước ép, trái cây, v.v.]. Bạn có thể muốn kết hợp tất cả các thông tin để tạo một bảng duy nhất với tất cả các nhà cung cấp.
Trong những trường hợp này, bạn sẽ muốn kết hợp hai hoặc nhiều bảng mà không yêu cầu một cột chung. Có vẻ như nó phải là một bài tập SQL khá đơn giản. Vâng, tất nhiên nó được! Tôi sẽ đề xuất một vài giải pháp trong hướng dẫn này.you would want to combine two or more tables without requiring a common column. It sounds like it should be a pretty straightforward SQL assignment. Well, of course, it is! I’ll suggest a couple of solutions in this guide.
Nhưng trước tiên, hãy để khám phá dữ liệu mà chúng tôi sẽ sử dụng cho các ví dụ của chúng tôi.
Làm quen với dữ liệu
Chúng tôi điều hành một nhà hàng và có dữ liệu liên quan được lưu trữ trong nhiều bảng, trong đó là wine
và main_course
.
Bảng wine
chứa ID rượu, tên rượu, ID nhà cung cấp và giá:
1 | Merlot | 500 | 7.95 |
2 | Căn nhà | 400 | 2.45 |
3 | Sangiovese | 600 | 5.20 |
Bảng main_course
chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn:
main_course
1 | Merlot | 200 | 19.99 |
2 | Căn nhà | 100 | 8.99 |
3 | Sangiovese | 300 | 11.99 |
4 | Bảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn: | 400 | 15.99 |
Salmon Maple thảo quả
Macaroni & pho mát cổ điển
Gà Teriyaki nướngall possible combinations of wines and main courses from our menu. There are at least two approaches to combining the wine
and the main_course
tables to get the result we need.
Thịt bò thịt phô mai xanh
Hãy để xem cách chúng ta có thể kết hợp các bảng này để có được kết quả chúng ta muốn.
Cách kết hợp hai bảng mà không có cột chung
SELECT w.name AS wine, m.name AS main_course FROM wine w, main_course m;
Trong ví dụ đầu tiên của chúng tôi, chúng tôi muốn thấy tất cả các kết hợp có thể có của rượu vang và các khóa học chính từ thực đơn của chúng tôi. Có ít nhất hai cách tiếp cận để kết hợp bảng wine
và main_course
để có được kết quả chúng ta cần.Cartesian product [a cross join], whose result set has the total number of rows equal to
the number of rows in the first table multiplied by the number of rows in the second table.
Merlot | Merlot |
Căn nhà | Merlot |
Sangiovese | Merlot |
Merlot | Căn nhà |
Căn nhà | Căn nhà |
Sangiovese | Căn nhà |
Merlot | Sangiovese |
Căn nhà | Sangiovese |
Sangiovese | Sangiovese |
Merlot | Bảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn: |
Căn nhà | Bảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn: |
Sangiovese | Bảng main_course chứa ID khóa học chính, tên, ID nhà cung cấp của nhà cung cấp chính cho món ăn này và giá, cho mỗi món ăn: |
Salmon Maple thảo quả
Macaroni & pho mát cổ điển
Gà Teriyaki nướng
Thịt bò thịt phô mai xanh
Như bạn có thể đã đoán, cách tiếp cận thứ hai để có được tất cả các kết hợp có thể của các hàng từ hai bảng là bằng cách sử dụng toán tử
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;5:
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;
Truy vấn này đưa ra kết quả chính xác giống như được hiển thị trước đó. Tuy nhiên, cú pháp này thích hợp hơn vì nó nêu rõ ý định thực hiện
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;5 và dễ đọc hơn đối với người dùng khác của mã SQL của bạn.this syntax is preferable as it clearly states the intent to perform a
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;5 and is more readable for other users of your SQL code.
Tìm hiểu thêm về Cross Joins trong hướng dẫn minh họa của chúng tôi về SQL Cross tham gia.
Sử dụng Liên minh hoặc Liên minh tất cả
Có các trường hợp sử dụng khác để kết hợp hai bảng mà không có cột chung. Như trong ví dụ đã đề cập trước đó, bạn có thể muốn hợp nhất tất cả các thông tin nhà cung cấp được lưu trữ trong nhiều bảng. Bạn không muốn có một sản phẩm Cartesian trong trường hợp này. Vì vậy, làm thế nào để bạn kết hợp các bảng?
Trong trường hợp này, bạn sử dụng
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;9 để hợp nhất thông tin từ nhiều bảng. Đây không phải là một sự tham gia; Tuy nhiên, nó có thể rất tiện dụng để kết hợp các hàng từ một số bảng, như trong ví dụ của chúng tôi dưới đây.
Nói một cách đơn giản,
SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;0 Kết hợp dữ liệu bằng cách nối thêm các cột từ một bảng cùng với các cột từ một bảng khác. Ngược lại,
SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;1 kết hợp dữ liệu bằng cách nối các hàng dọc theo các hàng từ một bảng khác.
Vì vậy, nếu chúng tôi muốn tạo danh sách kết hợp ID nhà cung cấp từ các bảng wine
và main_course
, chúng tôi có thể sử dụng truy vấn SQL sau:
SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;
Ở đây, trước tiên chúng tôi chọn ID nhà cung cấp từ bảng wine
[cột
SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;5] và từ bảng
main_course
[cột SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;7] riêng biệt. Sau đó, chúng tôi kết hợp các hàng này bằng từ khóa
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;9. Cuối cùng, chúng tôi sắp xếp kết quả để thuận tiện:
100 |
200 |
300 |
400 |
500 |
600 |
Lưu ý những điều sau khi sử dụng
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;9 trong SQL:
- Tất cả các câu lệnh
SELECT w.supplier_id FROM wine w UNION ALL SELECT m.major_supplier_id FROM main_course m ORDER BY 1;
0 nên liệt kê cùng một số cột.the same number of columns. - Các cột tương ứng phải có cùng loại dữ liệu.the same data type.
- Các cột tương ứng có thể có các tên khác nhau, như chúng làm trong ví dụ của chúng tôi. Theo mặc định, tên của cột tương ứng trong đầu ra sẽ được lấy từ câu lệnh
SELECT w.supplier_id FROM wine w UNION ALL SELECT m.major_supplier_id FROM main_course m ORDER BY 1;
0 đầu tiên. Nếu cần thiết, bạn có thể đặt tên cho các cột kết quả bằng cách sử dụng từ khóa AS. Lưu ý rằng các cột từ các bảng khác nhau phải được đặt tên theo cùng một thứ tự để chúng tương ứng chính xác.can have different names, as they do in our example. By default, the name of the corresponding column in the output will be taken from the firstSELECT w.supplier_id FROM wine w UNION ALL SELECT m.major_supplier_id FROM main_course m ORDER BY 1;
0 statement. If necessary, you can set the names for the resulting columns using the AS keyword. Note that the columns from different tables have to be named in the same order for them to correspond correctly. Toán tử
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;
9 loại bỏ các bản sao khỏi tập kết quả. Như bạn có thể nhận thấy,SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;
5 400 nằm trong cả hai bảng, nhưng nó chỉ xuất hiện một lần trong tập kết quả. Nếu bạn không muốn loại bỏ các bản sao, hãy sử dụng toán tửSELECT w.supplier_id FROM wine w UNION ALL SELECT m.major_supplier_id FROM main_course m ORDER BY 1;
4 thay thế:SELECT w.supplier_id FROM wine w UNION ALL SELECT m.major_supplier_id FROM main_course m ORDER BY 1;
Kết quả của truy vấn này sẽ bao gồm
SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;5 400 hai lần:
100 |
200 |
300 |
400 |
400 |
500 |
600 |
Nếu cả
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;5 và
SELECT w.name AS wine, m.name AS main_course FROM wine w CROSS JOIN main_course m;9 đều áp dụng cho trường hợp sử dụng của bạn là kết hợp hai bảng mà không có cột chung, hãy xem bài viết này với các ví dụ về các kết nối không cân bằng. Bạn có thể tìm thấy một số ví dụ có liên quan ở đó.
Thời gian để thực hành tham gia chéo và công đoàn!
Bây giờ bạn biết rất nhiều về việc kết hợp các bảng mà không có cột chung. Bạn sẽ được chuẩn bị cho câu hỏi về cách kết hợp hai bảng mà không cần một cột chung. Đây là một câu hỏi rất phổ biến trong các cuộc phỏng vấn xin việc SQL!
Nếu bạn muốn tìm hiểu thêm về
SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;0, hãy xem video cơ bản của SQL tham gia từ loạt phim We We Learn SQL của chúng tôi trên YouTube. Ngoài ra, hãy thử Hướng dẫn tìm hiểu về các cách tốt nhất để học các tham gia SQL.
Tuy nhiên, có lẽ bạn đã biết rằng con đường ngắn nhất để trở thành một chuyên gia SQL là thông qua rất nhiều thực hành viết các truy vấn SQL. LearnSQL.com cung cấp một khóa học toàn diện về SQL tham gia với 93 bài tập tương tác. Trong khóa học này, bạn sẽ có cơ hội thực hành tất cả các loại ____20 cơ bản, bao gồm LEFT JOIN
0, tự tham gia, không cân bằng và tham gia nhiều bảng.93 interactive
exercises. In this course, you’ll have the opportunity to practice all kinds of basic
SELECT w.supplier_id FROM wine w UNION SELECT m.major_supplier_id FROM main_course m ORDER BY supplier_id;0, including
LEFT JOIN
0, self-joins, non-equi joins, and joins of multiple tables.Học hỏi!