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

Tham gia ba bảng với các tham gia khác ngoài INNER JOIN

Có, tôi sử dụng cả ba trong số các JOIN đó, mặc dù tôi có xu hướng chỉ sử dụng LEFT (OUTER) JOIN s thay vì trộn giữa các THAM GIA TRÁI và PHẢI. Tôi cũng sử dụng FULL OUTER JOIN s và CROSS JOIN s.

Tóm lại, một INNER JOIN chỉ giới hạn tập kết quả đối với những bản ghi được thỏa mãn bởi điều kiện JOIN. Hãy xem xét các bảng sau

CHỈNH SỬA: Tôi đã đổi tên tên Bảng và đặt tiền tố chúng bằng @ để các Biến trong Bảng có thể được sử dụng cho bất kỳ ai đọc câu trả lời này và muốn thử nghiệm.

Nếu bạn cũng muốn thử nghiệm điều này trong trình duyệt, Tôi đã thiết lập tất cả điều này trên SQL Fiddle quá;

@Table1

id | name
---------
1  | One
2  | Two
3  | Three
4  | Four

@Table2

id | name
---------
1  | Partridge
2  | Turtle Doves
3  | French Hens
5  | Gold Rings

Mã SQL

DECLARE @Table1 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))

INSERT INTO @Table1 VALUES(1, 'One');
INSERT INTO @Table1 VALUES(2, 'Two');
INSERT INTO @Table1 VALUES(3, 'Three');
INSERT INTO @Table1 VALUES(4, 'Four');

DECLARE @Table2 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))

INSERT INTO @Table2 VALUES(1, 'Partridge');
INSERT INTO @Table2 VALUES(2, 'Turtle Doves');
INSERT INTO @Table2 VALUES(3, 'French Hens');
INSERT INTO @Table2 VALUES(5, 'Gold Rings');

INNER JOIN Câu lệnh SQL, được kết hợp trên id lĩnh vực

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
INNER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Kết quả trong

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens

LEFT JOIN sẽ trả về một tập hợp kết quả với tất cả các bản ghi từ bảng ở phía bên trái của phép nối (nếu bạn viết câu lệnh dưới dạng một lớp lót, bảng sẽ xuất hiện đầu tiên) và các trường từ bảng ở phía bên phải của phép nối khớp với biểu thức nối và được bao gồm trong SELECT mệnh đề. Thiếu chi tiết sẽ được điền bằng NULL

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
LEFT JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Kết quả trong

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens
4  | Four | NULL

RIGHT JOIN là logic tương tự như LEFT JOIN nhưng sẽ trả về tất cả các bản ghi từ phía bên phải của phép nối và các trường từ phía bên trái khớp với biểu thức phép nối và được bao gồm trong SELECT mệnh đề.

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
RIGHT JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Kết quả trong

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens
NULL| NULL| Gold Rings

Tất nhiên, cũng có FULL OUTER JOIN , bao gồm các bản ghi từ cả hai bảng đã kết hợp và điền bất kỳ thiếu nào chi tiết với NULL.

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
FULL OUTER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id

Kết quả trong

id | name | name
----------------
1  | One  | Partridge
2  | Two  | Turtle Doves
3  | Three| French Hens
4  | Four | NULL
NULL| NULL| Gold Rings

Và một CROSS JOIN (còn được gọi là CARTESIAN PRODUCT ), đơn giản là sản phẩm của việc áp dụng chéo các trường trong SELECT từ một bảng với các trường trong SELECT tuyên bố từ bảng khác. Lưu ý rằng không có biểu thức nối trong CROSS JOIN

SELECT 
    t1.id,
    t1.name,
    t2.name
FROM
    @Table1 t1
CROSS JOIN
    @Table2 t2

Kết quả trong

id | name  | name
------------------
1  | One   | Partridge
2  | Two   | Partridge
3  | Three | Partridge
4  | Four  | Partridge
1  | One   | Turtle Doves
2  | Two   | Turtle Doves
3  | Three | Turtle Doves
4  | Four  | Turtle Doves
1  | One   | French Hens
2  | Two   | French Hens
3  | Three | French Hens
4  | Four  | French Hens
1  | One   | Gold Rings
2  | Two   | Gold Rings
3  | Three | Gold Rings
4  | Four  | Gold Rings

CHỈNH SỬA:

Hãy tưởng tượng bây giờ có một Table3

@Table3

id | name
---------
2  | Prime 1
3  | Prime 2
5  | Prime 3

Mã SQL

DECLARE @Table3 TABLE (id INT PRIMARY KEY CLUSTERED, [name] VARCHAR(25))

INSERT INTO @Table3 VALUES(2, 'Prime 1');
INSERT INTO @Table3 VALUES(3, 'Prime 2');
INSERT INTO @Table3 VALUES(5, 'Prime 3');

Bây giờ cả ba bảng đều được kết hợp với INNER JOINS

SELECT 
    t1.id,
    t1.name,
    t2.name,
    t3.name
FROM
    @Table1 t1
INNER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id
INNER JOIN
    @Table3 t3
    ON 
        t1.id = t3.id

Kết quả trong

id | name | name         | name
-------------------------------
2  | Two  | Turtle Doves | Prime 1
3  | Three| French Hens  | Prime 2

Có thể hữu ích khi hiểu kết quả này bằng cách nghĩ rằng các bản ghi có id 2 và 3 là những bản ghi duy nhất chung cho cả 3 bảng cũng là lĩnh vực chúng tôi đang tham gia mỗi bảng.

Bây giờ cả ba với LEFT JOIN

SELECT 
    t1.id,
    t1.name,
    t2.name,
    t3.name
FROM
    @Table1 t1
LEFT JOIN
    @Table2 t2
    ON 
        t1.id = t2.id
LEFT JOIN
    @Table3 t3
    ON 
        t1.id = t3.id

Kết quả trong

id | name | name         | name
-------------------------------
1  | One  | Partridge    | NULL
2  | Two  | Turtle Doves | Prime 1
3  | Three| French Hens  | Prime 2
4  | Four | NULL         | NULL

Câu trả lời của Joel là một lời giải thích tốt cho việc giải thích tập kết quả này (Table1 là bảng cơ sở / nguồn gốc).

Bây giờ với INNER JOINLEFT JOIN

SELECT 
    t1.id,
    t1.name,
    t2.name,
    t3.name
FROM
    @Table1 t1
INNER JOIN
    @Table2 t2
    ON 
        t1.id = t2.id
LEFT JOIN
    @Table3 t3
    ON 
        t1.id = t3.id

Kết quả trong

id | name | name         | name
-------------------------------
1  | One  | Partridge    | NULL
2  | Two  | Turtle Doves | Prime 1
3  | Three| French Hens  | Prime 2

Mặc dù chúng tôi không biết thứ tự mà trình tối ưu hóa truy vấn sẽ thực hiện các hoạt động, chúng tôi sẽ xem xét truy vấn này từ trên xuống dưới để hiểu tập kết quả. INNER JOIN trên id giữa Table1 và Table2 sẽ hạn chế tập kết quả chỉ những bản ghi được thỏa mãn bởi điều kiện nối, tức là ba hàng mà chúng ta đã thấy trong ví dụ đầu tiên. Điều này tạm thời tập kết quả sau đó sẽ là LEFT JOIN ed thành Table3 trên id giữa Table1 và Tables; Có các bản ghi trong Table3 với id 2 và 3, nhưng không phải id 1, vì vậy trường t3.name sẽ có chi tiết cho 2 và 3 chứ không phải 1.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chạy tất cả các tệp SQL trong một thư mục

  2. Lọc theo Tùy chọn OFFSET-FETCH trong Truy vấn chọn - Hướng dẫn SQL Server / TSQL Phần 118

  3. Lỗi đăng nhập máy chủ SQL:Đăng nhập không thành công cho người dùng 'NT AUTHORITY \ SYSTEM'

  4. Giới hạn các hàng được trả lại trong truy vấn SQL Server bằng cách sử dụng mệnh đề TOP

  5. Ghi nhật ký TẤT CẢ Truy vấn trên Cơ sở dữ liệu SQL Server 2008 Express?