Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Tham gia chéo SQL

Bài viết này cung cấp tổng quan về CROSS JOIN trong SQL, cũng như một số ví dụ cơ bản.

SQL CROSS JOIN (hoặc FULL OUTER JOIN ) trả về 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.

Nói cách khác, nó trả về tích số Descartes của các hàng từ các bảng trong phép nối.

Cú pháp

Bạn chỉ định một liên kết chéo trong FROM mệnh đề.

Cú pháp như sau:

SELECT *
FROM Table1 CROSS JOIN Table2 
ON Table1.Column = Table2.Column;

Ví dụ 1

Đây là một ví dụ để chứng minh.

Dữ liệu mẫu

Đầu tiên, đây là các bảng mà chúng tôi sẽ sử dụng để làm ví dụ.

t1 bảng:

+--------+
| col1   |
|--------|
| a      |
| b      |
| c      |
+--------+

t2 bảng:

+--------+
| col1   |
|--------|
| 1      |
| 2      |
| 3      |
+--------+

Truy vấn tham gia chéo

Dưới đây là một ví dụ về thực hiện kết hợp chéo với hai bảng đó.

SELECT * FROM t1 
CROSS JOIN t2;

Kết quả:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Vì vậy, truy vấn của chúng tôi trả về 9 hàng, mặc dù chỉ có 3 hàng trong mỗi bảng.

Điều này là do cách thức hoạt động của phép nối chữ thập. Số hàng được trả về là số hàng trong bảng bên trái, nhân với số hàng trong bảng bên phải.

Xem cách nó lặp qua bảng bên trái, xuất ra từng hàng trong bảng bên phải cho mỗi hàng trong bảng bên trái.

Điều này có tác dụng tương tự như làm như sau:

SELECT * FROM t1, t2

Kết quả:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| b      | 1      |
| c      | 1      |
| a      | 2      |
| b      | 2      |
| c      | 2      |
| a      | 3      |
| b      | 3      |
| c      | 3      |
+--------+--------+
(9 rows affected)

Ví dụ 2

Đây là những gì sẽ xảy ra nếu chúng ta thêm WHERE điều khoản tham gia chéo của chúng tôi.

SELECT * FROM t1 
CROSS JOIN t2
WHERE t1.col1 = 'a';

Kết quả:

+--------+--------+
| col1   | col1   |
|--------+--------|
| a      | 1      |
| a      | 2      |
| a      | 3      |
+--------+--------+
(3 rows affected)

Ví dụ 3

Giả sử chúng ta có các bảng sau.

PetTypes bảng:

+-------------+-----------+
| PetTypeId   | PetType   |
|-------------+-----------|
| 1           | Bird      |
| 2           | Cat       |
| 3           | Dog       |
| 4           | Rabbit    |
+-------------+-----------+
(4 rows affected)

Pets bảng:

+---------+-------------+-----------+-----------+------------+
| PetId   | PetTypeId   | OwnerId   | PetName   | DOB        |
|---------+-------------+-----------+-----------+------------|
| 1       | 2           | 3         | Fluffy    | 2020-11-20 |
| 2       | 3           | 3         | Fetch     | 2019-08-16 |
| 3       | 2           | 2         | Scratch   | 2018-10-01 |
| 4       | 3           | 3         | Wag       | 2020-03-15 |
| 5       | 1           | 1         | Tweet     | 2020-11-28 |
| 6       | 3           | 4         | Fluffy    | 2020-09-17 |
| 7       | 3           | 2         | Bark      | NULL       |
| 8       | 2           | 4         | Meow      | NULL       |
+---------+-------------+-----------+-----------+------------+
(8 rows affected)

Trong trường hợp này, Pets.PetTypeId là một khóa ngoại của PetTypes.PetTypeId cột.

Bây giờ, đây là một ví dụ về chạy kết hợp chéo trên hai bảng đó, nhưng sử dụng WHERE mệnh đề.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt
WHERE p.PetTypeId = pt.PetTypeId;

Kết quả:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Cat       |
| Fetch     | Dog       |
| Scratch   | Cat       |
| Wag       | Dog       |
| Tweet     | Bird      |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Cat       |
+-----------+-----------+
(8 rows affected)

Thêm WHERE mệnh đề đến phép nối chéo đã biến nó thành một phép nối bên trong.

Đây là những gì sẽ xảy ra nếu chúng tôi xóa WHERE mệnh đề.

SELECT 
    p.PetName,
    pt.PetType
FROM Pets p 
CROSS JOIN PetTypes pt;

Kết quả:

+-----------+-----------+
| PetName   | PetType   |
|-----------+-----------|
| Fluffy    | Bird      |
| Fetch     | Bird      |
| Scratch   | Bird      |
| Wag       | Bird      |
| Tweet     | Bird      |
| Fluffy    | Bird      |
| Bark      | Bird      |
| Meow      | Bird      |
| Fluffy    | Cat       |
| Fetch     | Cat       |
| Scratch   | Cat       |
| Wag       | Cat       |
| Tweet     | Cat       |
| Fluffy    | Cat       |
| Bark      | Cat       |
| Meow      | Cat       |
| Fluffy    | Dog       |
| Fetch     | Dog       |
| Scratch   | Dog       |
| Wag       | Dog       |
| Tweet     | Dog       |
| Fluffy    | Dog       |
| Bark      | Dog       |
| Meow      | Dog       |
| Fluffy    | Rabbit    |
| Fetch     | Rabbit    |
| Scratch   | Rabbit    |
| Wag       | Rabbit    |
| Tweet     | Rabbit    |
| Fluffy    | Rabbit    |
| Bark      | Rabbit    |
| Meow      | Rabbit    |
+-----------+-----------+
(32 rows affected)

Chúng tôi nhận được một phép nối chéo trả về 32 hàng.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ODBC 4.0

  2. Chốt APPEND_ONLY_STORAGE_INSERT_POINT

  3. Kết nối các ứng dụng ODBC trên Windows với SugarCRM

  4. Các lệnh SQL được phân loại như thế nào | UBIQ

  5. Thiếu chỉ mục trong MS SQL hoặc Tối ưu hóa nhanh chóng