2010-09-15 23 views
5

Tôi không chắc chắn cách mô tả cấu trúc bảng của mình, vì vậy, hy vọng điều này có ý nghĩa ...Cách thực hiện Tham gia bên ngoài trên> 2 Bàn (Oracle)

Tôi có 3 bảng trong mối quan hệ thứ bậc như A mối quan hệ một đến nhiều với B mà lần lượt có mối quan hệ một đến nhiều với C. Bí quyết là khóa ngoại trong B và C được phép là rỗng (tức là không có cha mẹ xác định). Tôi cũng có D và E không liên quan đến A, B hoặc C (trực tiếp).

Cuối cùng, tôi có F là bảng nối kết có nhiều mối quan hệ với C, D và E. Không có trường nào của nó (FK cho các bảng khác) không có giá trị.

Tôi muốn viết một câu lệnh SQL nối tất cả các bảng trong một tập kết quả. Tôi biết tôi phải sử dụng các kết nối bên ngoài bởi vì tôi muốn tất cả A được trả lại bất kể nó có con trong B hay không và B và C.

Câu hỏi Một: Tôi đã xem xét kết nối bên ngoài ANSI cú pháp (tôi đã chỉ sử dụng Oracle "(+)" trước đó) và không thể tìm thấy một ví dụ mà bên ngoài tham gia nhiều hơn 2 bảng. Ai đó có thể cung cấp/chỉ cho một ví dụ?

Câu hỏi hai: Có thể bao gồm các bản ghi từ bảng D và E dựa trên bảng kết nối F không? Nếu vậy, điều này có được thực hiện với các kết nối bên ngoài không?

Cảm ơn!

EDIT

Tất nhiên, ngay sau khi tôi đăng bài này, tôi tìm thấy một ví dụ mà trả lời câu hỏi 1. Tuy nhiên, câu hỏi 2 vẫn cho tôi bối rối.

Ví dụ:

  SELECT A.a, 
       B.b, 
       C.c 
      FROM A 
FULL OUTER JOIN B ON B.a = A.a 
FULL OUTER JOIN C ON C.b = B.b 
+0

Bạn có thể không muốn FULL OUTER JOIN; nó tồn tại, nhưng nó rất hiếm khi được sử dụng (hoặc hữu ích). –

+0

Bạn chưa chỉ định các cột nào trong F tham gia với mỗi bảng khác - điều đó có nghĩa là không ai có thể đưa ra câu trả lời dứt khoát. –

+0

Bạn có thể đăng một số dữ liệu mẫu và recordset mà bạn muốn nhận không? A's, B's C's không phải là những cái tên rất thông tin. – Quassnoi

Trả lời

0

Để làm rõ, các chữ in hoa được gọi là bảng và chữ thường cho cột khóa chính/cột ngoài. Có lẽ tôi đã viết nó tương tự như Quassnoi, nhưng sẽ tiếp tục với điều này vì đó là cách nó bắt đầu.

SQL sau sẽ trả về kết quả tôi loooking cho:

  SELECT A.a, 
       B.b, 
       C.c, 
       D.d, 
       E.e 
      FROM A 
FULL OUTER JOIN B ON B.a = A.a 
FULL OUTER JOIN C ON C.b = B.b 
FULL OUTER JOIN F ON F.c = C.c 
FULL OUTER JOIN D ON D.d = F.d 
FULL OUTER JOIN E ON E.e = F.e 

Tôi cố gắng để thiết lập SQL của tôi như Bill nhưng sử dụng ĐẦY ĐỦ tham gia thay vì những LEFT, nhưng nó không trả lại kết quả tương tự như của tôi Tôi không thể nói rằng tôi hoàn toàn hiểu được SQL của mình, nhưng INNER tham gia lọc một số kết quả.

1
select a.*, b.*, c.* 
from a 
left outer join b on a.b_id = b.id 
left outer join c on a.c_id = c.id 

Bây giờ, nhận được D, E & F trong đó bị phức tạp hơn:

select c.*, d.*, e.* 
from C 
inner join f on c.id = f.c_id 
inner join d on d.id = f.d_id 
inner join e on d.id = f.e_id 

Sau đó, chúng tôi đặt nó tất cả cùng nhau:

select a.*, b.*, cde.* 
from a 
left outer join b on a.b_id = b.id 
left outer join 
(select c.id as c_id, c.*, d.*, e.* 
    from C 
    inner join f on c.id = f.c_id 
    inner join d on d.id = f.d_id 
    inner join e on d.id = f.e_id) CDE 
on a.c_id = cde.c_id 
+0

Cảm ơn! Chúng tôi phải đã được đăng cùng một lúc. – sdoca

0
SELECT a.*, b.*, c.*, d.*, e.* 
FROM a 
LEFT JOIN 
     b 
ON  b.a = a.id 
LEFT JOIN 
     с 
ON  c.b = b.id 
LEFT JOIN 
     f 
ON  f.с = c.id 
LEFT JOIN 
     d 
ON  d.id = f.d 
LEFT JOIN 
     e 
ON  e.id = f.e 
9

Vì vậy, tôi hình dung sơ đồ của bạn như thế này:

A --o< B --o< C --<F>-- D 
         >-- E 

Bạn chắc chắn có thể làm nhiều tham gia, và bạn cũng có thể tham gia nhóm biểu thức với dấu ngoặc đơn giống như bạn có thể biểu thức số học nhóm.

SELECT ... 
FROM A LEFT OUTER JOIN (
    B LEFT OUTER JOIN (
    C LEFT OUTER JOIN (
     F INNER JOIN D ON D.d = F.d 
     INNER JOIN E ON E.e = F.e 
    ) ON C.c = F.c 
    ) ON B.b = C.b 
) ON A.a = B.a 

Những ngoặc là không truy vấn con, chúng tôi chỉ cách nhóm tham gia hoạt động.

+2

Đó là một cách tuyệt vời để "vẽ" lược đồ của tôi. Cảm ơn! Tôi cần dành một chút thời gian để tìm hiểu xem câu lệnh chọn của bạn có làm những gì tôi đang hy vọng hay không, nhưng tôi nghĩ tôi cần sử dụng các phép nối HOÀN TOÀN như bình luận của tôi ở trên cho Jonathan. – sdoca

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