2010-07-12 43 views
14

Tôi đang cố truy xuất hai bộ thông tin (các phần màu đỏ và xanh của biểu đồ trong một truy vấn.THAM GIA ba bảng

Tôi nghĩ mình có thể làm điều đó bằng cách sử dụng sql như đã nêu bên dưới nhưng không trả về tôi bất cứ điều gì khi TableC không có hồ sơ. Nếu TableC không có hồ sơ, tôi sẽ vẫn muốn truy vấn này để trả lại cho tôi những kết quả như được chỉ ra bởi khu vực BLUE.

CHỌN A. * TỪ TableA Một

THAM GIA Bảng B BẬT (A.id = B.a_id)

THAM GIA TableC C ON (A.id = C.a_id)

Đánh giá cao bất kỳ con trỏ nào để trả lại phân đoạn màu đỏ và/hoặc màu xanh lam. Cảm ơn trước =]

Trả lời

15

thử một cái gì đó như thế này

SELECT A.* FROM TableA A 
LEFT OUTER JOIN TableB B ON (A.id = B.a_id) 
LEFT OUTER JOIN TableC C ON (A.id = C.a_id) 
WHERE B.a_id IS NOT NULL 
    OR c.a_id IS NOT NULL 
+3

+1 - Trông tốt với tôi, ngoài việc có một thiếu "ON" giữa "Tab leC C "và" (A.id " –

9

Để hiểu lý do tại sao bạn không nhận được bất kỳ kết quả khi TableC không có hồ sơ, bạn cần phải tìm hiểu một chút về THAM GIA loại trong SQL.

Về cơ bản, khi bạn phát hành truy vấn

TableA A JOIN TableB B ON A.id = B.a_id 

bạn đang nói với cơ sở dữ liệu để nhìn vào cả hai TableATableB và lấy tất cả các cặp của hàng đáp ứng các gia vị (A.id = B.a_id). Do đó, nếu TableB trống, cơ sở dữ liệu không thể tìm thấy và cặp của các hàng có tiêu chí được đề cập trước.

Loại JOIN này được gọi là INNER JOIN và đây là loại hoạt động nối phổ biến nhất được sử dụng.

Trong trường hợp của bạn, bạn muốn lấy tất cả hàng từ TableA X TableB và tất cả hàng có liên quan từ TableC, nếu hàng như vậy tồn tại (dựa trên tham gia predictate "A.id = C.a_id". Đây là trường hợp Hai loại phổ biến nhất của sự tham gia như vậy là LEFT JOIN (bao gồm tất cả các hàng từ bảng bên trái) và RIGHT JOIN (bao gồm tất cả các hàng từ bảng bên phải). trường hợp, truy vấn của bạn phải là:

SELECT A.* 
FROM 
    (TableA A JOIN Table B B ON A.id = B.a_id) 
    LEFT JOIN TableC C ON A.id = C.a_ID 

tôi sẽ đề nghị để có một cái nhìn tại trang relevant Wikipedia, nếu bạn muốn biết thêm về các loại tham gia trong SQL

Sửa

Bằng cách làm theo cùng một logic, nếu bạn muốn có tất cả hàng từ TableA và chỉ có các hàng có liên quan từ các bảng TableBTableC (nếu chúng tồn tại), truy vấn của bạn sẽ trở thành:

SELECT A.* 
FROM 
    (TableA A LEFT JOIN Table B B ON A.id = B.a_id) 
    LEFT JOIN TableC C ON A.id = C.a_ID 
Các vấn đề liên quan