2013-04-13 39 views
13

Sombody có thể Giải thích cho tôi về các kết nối không?Tham gia nhiều bảng trong SQL

Tham gia nội bộ sẽ chọn dữ liệu chung dựa trên điều kiện.

Kết nối bên ngoài bên trái chọn tất cả dữ liệu từ trái không phân biệt chung nhưng lấy dữ liệu chung từ bảng bên phải và ngược lại cho bên phải.

Tôi biết những điều cơ bản nhưng câu hỏi vẫn còn khi nói đến tham gia cho hơn 5, 8, 10 bảng.

Giả sử tôi có 10 bảng để tham gia. Nếu tôi có tham gia bên trong với 5 bảng đầu tiên và bây giờ cố gắng áp dụng một phép nối trái với bảng thứ 6, bây giờ truy vấn sẽ hoạt động như thế nào?

Tôi muốn nói bây giờ tập kết quả của 5 bảng đầu tiên sẽ được lấy làm bảng bên trái và bảng thứ 6 sẽ được xem là bảng bên phải? Hoặc chỉ bảng thứ năm sẽ được coi là trái và thứ 6 là đúng? Xin hãy giúp tôi về việc này.

+1

[Đại diện trực quan của các lần tham gia SQL] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) –

+0

@JohnWoo Bài đăng đó bị loại bỏ bởi tác giả trong các ý kiến. Biểu đồ Venn không minh họa cách tham gia chung có liên quan đến các đầu vào của nó như thế nào. – philipxy

Trả lời

17

Khi tham gia nhiều bảng, đầu ra của mỗi phép nối hợp lý sẽ tạo thành một bảng ảo đi vào kết nối tiếp theo.

Vì vậy, trong ví dụ trong câu hỏi của bạn, kết quả tổng hợp khi tham gia 5 bảng đầu tiên sẽ được coi là bảng bên tay trái.

Xem Itzik Ben-Gan's Logical Query Processing Poster để biết thêm về điều này.

Các bảng ảo liên quan đến các phép nối có thể được điều khiển bằng cách định vị mệnh đề ON. Ví dụ

SELECT * 
FROM T1 
     INNER JOIN T2 
     ON T2.C = T1.C 
     INNER JOIN T3 
        LEFT JOIN T4 
        ON T4.C = T3.C 
     ON T3.C = T2.C 

tương đương với (T1 Inner Join T2) Inner Join (T3 Left Join T4)

+2

re "Các bảng ảo ... có thể được điều khiển bằng cách định vị mệnh đề ON" Cool! Tất cả các phương ngữ SQL phổ biến đều quan sát điều đó? –

+2

@PieterGeerkens - Vâng, đó là ANSI SQL. ví dụ. [Postgres Fiddle] (http://www.sqlfiddle.com/#!1/c3de8/1) và [MySQL Fiddle] (http://www.sqlfiddle.com/#!8/c3de8/3). Mặc dù MySQL yêu cầu dấu ngoặc đơn. –

5

Sẽ có ích khi nghĩ về JOIN 's theo thứ tự, vì vậy trước đây là chính xác.

SELECT * 
    FROM a 
    INNER JOIN b ON b.a = a.id 
    INNER JOIN c ON c.b = b.id 
    LEFT JOIN d ON d.c = c.id 
    LEFT JOIN e ON e.d = d.id 

sẽ được tất cả các lĩnh vực từ abc nơi tất cả các tiêu chí phù hợp với ON, cộng với giá trị từ d nơi tiêu chí của nó phù hợp cộng với tất cả các nội dung của e nơi tất cả các trận đấu tiêu chuẩn của nó.

Tôi biết RIGHT JOIN là hoàn toàn có thể chấp nhận được, nhưng tôi nhận thấy trong kinh nghiệm của mình rằng điều đó là không cần thiết - tôi hầu như luôn tham gia mọi thứ từ trái sang phải.

1

> Simple INNER JOIN đang XEM ...

CREATE VIEW room_view 
AS SELECT a.*,b.* 
FROM j4_booking a INNER JOIN j4_scheduling b 
on a.room_id = b.room_id; 
0

Bạn có thể áp dụng tham gia như thế này ..

select a.*,b.*,c.*,d.*,e.* 
from [DatabaseName].[Table_a] a 
INNER JOIN [DatabaseName].[Table_b] b ON a.id = b.id 
INNER JOIN [DatabaseName].[Table_c] c ON b.id=c.id 
INNER JOIN [DatabaseName].[Table_d] d on c.id=d.id 
INNER JOIN [DatabaseName].[Table_e] e on d.id=e.id where a.con=5 and 
b.con=6 

Ở đây, tại nơi a. * Và ở nơi mà điều kiện, bạn có thể hiển thị cột (đã nộp) mà bạn thích và theo điều kiện ở nơi điều kiện. Bạn có thể chèn thêm bảng và cơ sở dữ liệu theo sự lựa chọn của bạn. Nhưng hãy nhớ rằng bạn cần phải đề cập đến tên cơ sở dữ liệu và bí danh nếu bạn làm việc trong cơ sở dữ liệu khác nhau.

Các vấn đề liên quan