THAM GIA CROSS vs INNER THAM GIA trong SQL


150

Sự khác biệt giữa CROSS JOINvà là INNER JOINgì?

THAM GIA CROSS:

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status], 
FROM   
    Customers 
CROSS JOIN 
    Movies

THAM GIA

SELECT 
    Movies.CustomerID, Movies.Movie, Customers.Age, 
    Customers.Gender, Customers.[Education Level], 
    Customers.[Internet Connection], Customers.[Marital Status]
FROM   
    Customers 
INNER JOIN 
    Movies ON Customers.CustomerID = Movies.CustomerID

Cái nào tốt hơn và tại sao tôi lại sử dụng cái này?


15
CROSS JOINsẽ 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.
bummi

x CROSS JOIN yx INNER JOIN y ON 1=1
philipxy

Câu trả lời:


119

Tham gia chéo không kết hợp các hàng, nếu bạn có 100 hàng trong mỗi bảng với 1 đến 1 trận đấu, bạn sẽ nhận được 10.000 kết quả, Innerjoin sẽ chỉ trả lại 100 hàng trong cùng một tình huống.

2 ví dụ này sẽ trả về cùng một kết quả:

Tham gia chéo

select * from table1 cross join table2 where table1.id = table2.fk_id

Tham gia nội bộ

select * from table1 join table2 on table1.id = table2.fk_id

Sử dụng phương pháp cuối cùng


7
Và tôi tin rằng bạn có thể viết select * from table1 cross join table2 where table1.id = table2.fk_iddưới dạng select * from table1, table2 where table1.id = table2.fk_id(thay thế cross joinbằng a ,)
modulitos

5
@Lika đó là cú pháp cũ để tham gia, nhưng nó sẽ hoạt động. Tuy nhiên, tôi khuyên bạn nên sử dụng phiên bản của cliche, dễ đọc hơn nhiều.
iliketocode

1
bạn có ý nghĩa gì từ 1 đến 1 trận đấu? "Tình huống tương tự" nghĩa là gì
Jwan622

1
@iliketocode "cú pháp cũ để tham gia" không rõ ràng, tốt hơn bạn nên nói về các tiêu chuẩn SQL-89 và SQL-92
Ivanzinho

INNER THAM GIA "100" của bạn là trường hợp đặc biệt mà bạn chưa giải thích & bạn chưa giải thích trường hợp chung.
philipxy

186

Dưới đây là ví dụ tốt nhất về Cross Join và Inside Join.

Hãy xem xét các bảng sau

BÀN : Teacher

x------------------------x
| TchrId   | TeacherName | 
x----------|-------------x
|    T1    |    Mary     |
|    T2    |    Jim      |
x------------------------x

BÀN : Student

x--------------------------------------x
|  StudId  |    TchrId   | StudentName | 
x----------|-------------|-------------x            
|    S1    |     T1      |    Vineeth  |
|    S2    |     T1      |    Unni     |
x--------------------------------------x

1. THAM GIA

Tham gia bên trong chọn các hàng thỏa mãn cả bảng .

Hãy xem xét chúng ta cần tìm các giáo viên là giáo viên lớp và học sinh tương ứng của họ. Trong điều kiện đó, chúng ta cần phải áp dụng JOINhoặc INNER JOINsẽ

nhập mô tả hình ảnh ở đây

Truy vấn

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
INNER JOIN #Student S ON T.TchrId = S.TchrId

Kết quả

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

2. THAM GIA

Tham gia chéo chọn tất cả các hàng từ bảng đầu tiên và tất cả các hàng từ bảng thứ hai và hiển thị dưới dạng sản phẩm của Cartesian, với tất cả các khả năng

Xem xét chúng ta cần tìm tất cả các giáo viên trong trường và học sinh không phân biệt giáo viên lớp, chúng ta cần phải áp dụng CROSS JOIN.

nhập mô tả hình ảnh ở đây

Truy vấn

SELECT T.TchrId,T.TeacherName,S.StudentName 
FROM #Teacher T
CROSS JOIN #Student S 

Kết quả

x--------------------------------------x
|  TchrId  | TeacherName | StudentName | 
x----------|-------------|-------------x            
|    T2    |     Jim     |    Vineeth  |
|    T2    |     Jim     |    Unni     |
|    T1    |     Mary    |    Vineeth  |
|    T1    |     Mary    |    Unni     |
x--------------------------------------x

1
Khóa của Hình 2 rất phức tạp: Nó bao quanh các phần tử (không liên quan màu) của một đối số của CROSS THAM GIA & một số (giá trị không liên quan) là một hàng của nó & một dòng (không liên quan màu) là một hàng kết quả. Đối với các bảng dưới dạng túi, đó không phải là biểu đồ Venn: đối với các hàng là giá trị, nó sai ; đối với các hàng là các phần tử chúng không thể được chia sẻ. Đối với các bảng dưới dạng tập hợp, bạn không cần biểu đồ Venn. Hình 1 là một nỗ lực khủng khiếp phổ biến để giải thích THAM GIA. Khóa của nó cũng phức tạp: Nó chỉ dành cho các bảng dưới dạng tập hợp & chỉ đẳng và chỉ một giá trị; nó cũng đại diện cho đầu vào khác với đầu ra. Viết cho THAM GIA nói chung.
philipxy

Hình 1 hữu ích và chính xác như là màu đầu tiên trong 4 màu của sơ đồ Venn hình tròn giao nhau cho: (INNER) THAM GIA so với TRÁI, RIGHT & FULL (OUTER) THAM GIA nhưng không so với CROSS THAM GIA. Các hàng giao nhau nằm trong THAM GIA, các hàng trái / phải là các hàng bổ sung (không được mở rộng) trong LEFT / RIGHT THAM GIA. Nó bao gồm CROSS THAM GIA như một trường hợp đặc biệt của (INNER) THAM GIA khi không có hàng nào trong giao lộ.
philipxy

1
Cảm ơn đề nghị của bạn. Nhưng dù sao, OP đã yêu cầu sự khác biệt giữa hai lần tham gia này. Tôi đã trả lời cho câu hỏi này theo cách mà bất kỳ người mới bắt đầu nào cũng có thể dễ dàng hiểu được sự khác biệt giữa chúng. Như bạn đã nói, tôi đã không đưa ra các khóa như trong môi trường sản xuất. Nó chỉ là một ví dụ để hiểu dễ dàng. Và Cross Join, bạn có nghĩ rằng nó không trả về tất cả các hàng trừ khi một Wheremệnh đề được đưa ra không? Từ ý kiến ​​của bạn, có nhiều cơ hội cho người mới bắt đầu bị nhầm lẫn !!! @philipxy
Sarath Avanavu

1
Nhận xét của tôi chỉ ra rằng các sơ đồ rất khó diễn giải ngay cả khi người ta biết những gì họ đang cố gắng nói không phù hợp với chủ đề này. Theo "khóa" (của Hình 2 hoặc 1) tôi có nghĩa là "giải thích ý nghĩa của các phần của sơ đồ". Bằng cách "viết nó", ý tôi là hãy cố gắng tự viết thật rõ ràng các phần của sơ đồ nghĩa là gì. Bạn sẽ thấy rằng các sơ đồ rất phức tạp và không thể hiện tham gia chéo so với tham gia bên trong! Tức là họ không thuộc về câu trả lời của bạn. Các khóa quan hệ Bảng PS không có vai trò trong việc giải thích những gì THAM GIA làm. PPS Sự khác biệt duy nhất giữa các phép nối là INNER THAM GIA có BẬT.
philipxy

Hãy tìm trong W3Schools w3schools.com/sql/sql_join_inner.asp nơi họ đã đưa ra loại sơ đồ tương tự cho INNER THAM GIA. Hãy chắc chắn rằng bạn đúng trước khi đưa ra nhận xét @philipxy
Sarath Avanavu

69

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 .)


6
+1 Tôi thích câu trả lời này nhất - những người khác dường như ngụ ý rằng kết quả sẽ khác nhau, nhưng nếu mệnh đề "BẬT" được thay thế bằng "WHERE" thì kết quả là như nhau
Ronnie

4
+1 Cảm ơn bạn đã xóa rằng bỏ qua mệnh đề BẬT trong THAM GIA VÀO sẽ mang lại kết quả chính xác như sử dụng CROSS THAM GIA
Cerno

"Sản phẩm chéo kiểu Cartesian theo khái niệm trung gian" - đó có phải là một cách nói khác, "nó không thực sự là một tập hợp các cặp được đặt hàng nhưng tôi không thể tránh nói 'sản phẩm của Cartesian'"? :) Bản thân tôi là một người không phải là nhà toán học, bối cảnh duy nhất mà tôi từng gặp phải thuật ngữ 'Sản phẩm của Cartesian' là khi ai đó đang giải thích về SQL CROSS JOIN. Tôi tự hỏi tần suất ai đó đến với SQL đã quen thuộc với sản phẩm của Cartesian nhưng không thể hiểu được CROSS JOIN.
ngày

1
@encedaywhen Toán tử Sản phẩm của Cartesian trả về một bộ các bộ dữ liệu được đặt hàng cho một số bộ. Kết quả là một sản phẩm của Cartesian. Các nền văn hóa quan hệ & SQL đáng buồn lạm dụng / quá tải "sản phẩm của Cartesian" cho các nhà khai thác gợi lên nhưng không phải là sản phẩm của Cartesian. Ví dụ Wikipedia! Tôi phản đối rằng - nó chỉ gây hiểu lầm / nhầm lẫn. Tuy nhiên, ở đây thật không may, tôi chỉ mô tả một cách mờ nhạt về cách SQL tham gia chéo hoạt động bằng các từ của riêng tôi và trì hoãn Wikipedia. Tôi gắn nhãn kết quả là "sản phẩm chéo Cartesian theo kiểu khái niệm trung gian". Có "Cartesian" dành cho những người buồn bã đã sử dụng / mong đợi nó.
philipxy

1
Đây là câu trả lời đúng, không giống như câu trả lời được đánh giá cao hơn. Đó là điển hình với SQL rằng các giải thích hời hợt, nghe có vẻ hợp lý, được định dạng tốt với các hình ảnh chi phối nội dung giáo dục, mặc dù không hiểu hoặc định nghĩa ngay cả những điều cơ bản của ngôn ngữ.
Charles Roddie

23

Tham gia nội bộ

Phép nối chỉ hiển thị các hàng có khớp trong cả hai bảng đã nối được gọi là phép nối trong. Đây là mặc định tham gia vào truy vấn và xem Designer.

Cú pháp cho Nội tham gia

SELECT t1.column_name,t2.column_name
FROM table_name1 t1
INNER JOIN table_name2 t2
ON t1.column_name=t2.column_name

Tham gia chéo

Một phép nối chéo tạo ra sản phẩm Cartesian của các bảng có liên quan đến phép nối. Kích thước của sản phẩm Cartesian là số lượng hàng trong bảng đầu tiên nhân với số lượng hàng trong bảng thứ hai.

Cú pháp cho Cross Tham gia

SELECT * FROM table_name1
CROSS JOIN table_name2

Hoặc chúng ta cũng có thể viết nó theo một cách khác

SELECT * FROM table_name1,table_name2

Bây giờ hãy kiểm tra truy vấn bên dưới để tham gia Cross

Thí dụ

SELECT * FROM UserDetails
CROSS JOIN OrderDetails

Hoặc là

SELECT * FROM UserDetails, OrderDetails


8

THAM GIA

Như tôi đã giải thích trong bài viết này , CROSS THAM GIA có nghĩa là tạo ra một Sản phẩm của Cartesian.

Một sản phẩm của Cartesian lấy hai bộ A và B và tạo ra tất cả các hoán vị có thể có của các bản ghi cặp từ hai bộ dữ liệu đã cho.

Ví dụ: giả sử bạn có các bảng sau đây rankssuitscơ sở dữ liệu:

Các cấp bậc và phù hợp với bảng

rankscó các hàng sau:

| name  | symbol | rank_value |
|-------|--------|------------|
| Ace   | A      | 14         |
| King  | K      | 13         |
| Queen | Q      | 12         |
| Jack  | J      | 11         |
| Ten   | 10     | 10         |
| Nine  | 9      |  9         |

Trong khi suitsbảng chứa các bản ghi sau:

| name    | symbol |
|---------|--------|
| Club    |       |
| Diamond |       |
| Heart   |       |
| Spade   |       |

Như CROSS THAM GIA truy vấn như sau:

SELECT
   r.symbol AS card_rank,
   s.symbol AS card_suit
FROM
   ranks r
CROSS JOIN
   suits s

sẽ tạo ra tất cả các hoán vị rankssuitescặp có thể:

| card_rank | card_suit |
|-----------|-----------|
| A         |          |
| A         |          |
| A         |          |
| A         |          |
| K         |          |
| K         |          |
| K         |          |
| K         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| Q         |          |
| J         |          |
| J         |          |
| J         |          |
| J         |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 10        |          |
| 9         |          |
| 9         |          |
| 9         |          |
| 9         |          |

THAM GIA

Mặt khác, INNER THAM GIA không trả về Sản phẩm Cartesian của hai bộ dữ liệu tham gia.

Thay vào đó, INNER THAM GIA lấy tất cả các yếu tố từ bảng bên trái và khớp chúng với các bản ghi trên bảng bên phải để:

  • nếu không có bản ghi nào khớp với bảng bên phải, hàng bên trái được lọc ra khỏi tập kết quả
  • đối với bất kỳ bản ghi khớp nào trên bảng bên phải, hàng bên trái được lặp lại như thể có Sản phẩm Cartesian giữa bản ghi đó và tất cả các bản ghi con liên quan của nó trên bảng bên phải.

Chẳng hạn, giả sử chúng ta có mối quan hệ một -nhiều bảng giữa cha mẹ postpost_commentbảng con trông như sau:

Mối quan hệ một-nhiều

Bây giờ, nếu postbảng có các bản ghi sau:

| id | title     |
|----|-----------|
| 1  | Java      |
| 2  | Hibernate |
| 3  | JPA       |

post_commentsbảng có các hàng này:

| id | review    | post_id |
|----|-----------|---------|
| 1  | Good      | 1       |
| 2  | Excellent | 1       |
| 3  | Awesome   | 2       |

Một truy vấn INNER THAM GIA như sau:

SELECT
   p.id AS post_id,
   p.title AS post_title,
   pc.review  AS review
FROM post p
INNER JOIN post_comment pc ON pc.post_id = p.id

sẽ bao gồm tất cả các posthồ sơ cùng với tất cả các liên kết của họ post_comments:

| post_id | post_title | review    |
|---------|------------|-----------|
| 1       | Java       | Good      |
| 1       | Java       | Excellent |
| 2       | Hibernate  | Awesome   |

Về cơ bản, bạn có thể nghĩ INNER THAM GIA như một CROSS THAM GIA được lọc trong đó chỉ các bản ghi khớp được lưu trong tập kết quả cuối cùng.

Để biết thêm chi tiết về cách INNER THAM GIA hoạt động, hãy xem bài viết này .


"INNER THAM GIA không trả lại Sản phẩm Cartesian của hai bộ dữ liệu tham gia" là một chút nhiều khi x INNER THAM GIA y trên 1 = 1 không trả lại. Vì vậy, "Thay vào đó" khi những gì bạn tiếp tục cố gắng nói thực tế (tất nhiên) trả lại cho điều kiện 1 = 1. Ngoại trừ việc ngôn ngữ trong các viên đạn không mô tả rõ ràng kết quả của một phép nối bên trong. Điều gì mô tả nó là một liên kết chéo ít hàng không đáp ứng điều kiện. Tương tự, ngôn ngữ tham gia chéo của bạn bằng cách sử dụng "kết hợp" không rõ ràng.
philipxy

7

SQL Server cũng chấp nhận ký hiệu đơn giản hơn về:

SELECT A.F, 
       B.G, 
       C.H 
  FROM TABLE_A A, 
       TABLE_B B, 
       TABLE_C C
 WHERE A.X = B.X 
   AND B.Y = C.Y

Sử dụng ký hiệu đơn giản hơn này, người ta không cần bận tâm về sự khác biệt giữa các phép nối bên trong và chéo. Thay vì hai mệnh đề "BẬT", có một mệnh đề "WHERE" duy nhất thực hiện công việc. Nếu bạn gặp khó khăn trong việc tìm ra mệnh đề "THAM GIA" "BẬT" đi đâu, hãy bỏ ký hiệu "THAM GIA" và sử dụng mệnh đề đơn giản hơn ở trên.

Nó không phải là gian lận.


2

Trong khi viết các truy vấn bằng cách sử dụng các phép nối bên trong, các bản ghi sẽ tìm nạp từ cả hai bảng nếu điều kiện được thỏa mãn trên cả hai bảng, tức là khớp chính xác của cột chung trong cả hai bảng.

Trong khi viết truy vấn bằng cách sử dụng tham gia chéo, kết quả giống như sản phẩm cartesian không có bản ghi trong cả hai bảng. ví dụ nếu bảng1 chứa 2 bản ghi và bảng2 chứa 3 bản ghi thì kết quả của truy vấn là 2 * 3 = 6 bản ghi.

Vì vậy, không đi tham gia chéo cho đến khi bạn cần điều đó.


2
Chỉ khi thiếu mệnh đề WHERE!
epitka

2

Tham gia chéo và tham gia bên trong là như nhau với sự khác biệt duy nhất là trong tham gia bên trong, chúng tôi sẽ lọc một số kết quả của sản phẩm cartesian

table1
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    option1  |
|    A     |      B1     |    option2  |
x--------------------------------------x

table2
x--------------------------------------x
|  fieldA  |    fieldB   |    fieldC   | 
x----------|-------------|-------------x            
|    A     |      B      |    optionB1 |
|    A1    |      B1     |    optionB2 |
x--------------------------------------x

 cross join
  A,B,option1,A,B,optionB1
  A,B,option1,A1,B1,optionB2
  A,B1,option2,A,B,optionB1
  A,B1,option2,A1,B1,optionB2

 inner join on field1 (only with the value is the same in both tables)
  A,B,option1,A,B,optionB1
  A,B1,option2,A,B,optionB1

 inner join on field1
  A,B,option1,A,B,optionB1

Đó là về thiết kế dữ liệu của chúng tôi, nơi chúng tôi quyết định rằng chỉ có một trường hợp của lĩnh vực chúng tôi đang sử dụng để tham gia. Tham gia chỉ tham gia chéo cả hai bảng và chỉ nhận được các dòng hoàn thành biểu thức boolean đặc biệt.

Lưu ý rằng nếu các trường mà chúng tôi đang thực hiện Joins của chúng tôi sẽ không có giá trị trong cả hai bảng, chúng tôi sẽ vượt qua bộ lọc. Tùy thuộc vào chúng tôi hoặc nhà sản xuất cơ sở dữ liệu để thêm các quy tắc bổ sung để tránh hoặc cho phép null. Tuân thủ các điều cơ bản, nó chỉ là một liên kết chéo theo sau là một bộ lọc.


0

Phép nối bên trong sẽ cho kết quả của các bản ghi khớp giữa hai bảng trong đó phép nối chéo cung cấp cho bạn các kết hợp có thể có giữa hai bảng.


0

A = {1,5,3,4,6,7,9,8} B = {2,8,5,4,3,6,9}

cross join đóng vai trò là sản phẩm của Cartesian A ✖ B = {1,2}, {1,8} ..., {5,2}, {5,8}, {5,5} ..... {3,3} ..., {6,6} .... {8,9} và trả về tập kết quả dài này ..

khi xử lý inner joinnó được thực hiện thông qua sản phẩm của Cartesian và chọn các cặp khớp nhau .. nếu nghĩ rằng cặp này được đặt hàng là khóa chính của hai bảng và tìm kiếm mệnh đề cho A = B, sau đó inner joinchọn {5,5}, {4,4}, {6,6} , {9,9} và cột được trả về trong mệnh đề chọn liên quan đến các id này.

nếu cross jointrên a = b thì kết quả tương tự được đặt là inner join. trong trường hợp đó cũng sử dụng inner join.


-1

Nó phụ thuộc vào đầu ra mà bạn mong đợi.

Một phép nối chéo khớp tất cả các hàng trong một bảng với tất cả các hàng trong một bảng khác. Một kết nối bên trong phù hợp trên một lĩnh vực hoặc các lĩnh vực. Nếu bạn có một bảng có 10 hàng và một bảng khác có 10 hàng thì hai phép nối sẽ hoạt động khác nhau.

Tham gia chéo sẽ có 100 hàng được trả về và chúng sẽ không liên quan, chỉ là những gì được gọi là sản phẩm của Cartesian. Sự tham gia bên trong sẽ khớp các bản ghi với nhau. Giả sử một cái có khóa chính và đó là khóa ngoại, bạn sẽ nhận được 10 hàng trả về.

Tham gia chéo có tiện ích chung hạn chế, nhưng tồn tại để hoàn thiện và mô tả kết quả của việc tham gia các bảng không có quan hệ được thêm vào truy vấn. Bạn có thể sử dụng liên kết chéo để tạo danh sách kết hợp các từ hoặc từ tương tự. Một tham gia bên trong mặt khác là tham gia phổ biến nhất.


Không làm mọi người bối rối. Tôi đã cố rút ngắn câu trả lời. Đây là câu trả lời ngắn tốt nhất có thể.
Shrikant Jadhav
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.