2011-03-08 7 views
8

Khi tôi thực hiện phép nối ngoài bên trái, tôi mong đợi nhận tất cả các bản ghi mà truy vấn sẽ trả về trước khi thêm bảng đã nối, nhưng nó chỉ trả về các bản ghi khớp với bảng (tức là: không có bản ghi cho '092387' tồn tại trong bảng 'tài liệu', vì vậy tôi chỉ muốn null trả về cho trường 'tên tệp' cho bản ghi đó.) Tôi đang làm gì sai?Bên ngoài bên trái Tham gia không trả về tất cả các bản ghi từ bảng chính

mysql> select documentation_reference.ref_docnumber 
      , documentation.filename 
     from documentation_reference 
     left outer join documentation on ref_docnumber=documentation.docnumber  
     where documentation_reference.docnumber='TP-036' 
     and documentation.status!=3; 
+---------------+-----------------+ 
| ref_docnumber | filename  | 
+---------------+-----------------+ 
| SOP-0042  | SOP-0042r39.pdf | 
+---------------+-----------------+ 
1 row in set (0.00 sec) 

mysql> select ref_docnumber 
     from documentation_reference 
     where documentation_reference.docnumber='TP-036'; 
+----------------------+ 
| ref_docnumber  | 
+----------------------+ 
| 092387    | 
| 1100218B    | 
| Applicable Item Spec | 
| SOP-0042    | 
+----------------------+ 
4 rows in set (0.00 sec) 

Trả lời

15

mệnh đề where của bạn đang chuyển đổi kết nối bên ngoài trở lại vào bên trong.

Các hàng không phù hợp với bảo quản bằng các outer join tất cả sẽ có giá trị cho NULLdocumentation.status nên tình trạng documentation.status != 3 của bạn sẽ lọc những trở ra (Kết quả của biểu thức NULL !=3unknown không true).

Để tránh vấn đề này sử dụng

select documentation_reference.ref_docnumber, 
     documentation.filename 
from documentation_reference 
     left outer join documentation 
     on ref_docnumber = documentation.docnumber 
      and documentation.status != 3 
where documentation_reference.docnumber = 'TP-036' 

Lưu ý rằng documentation.status != 3 vị được chuyển vào điều kiện JOIN.

+0

Đúng ... đó là nó. Cảm ơn sự giúp đỡ của bạn - điều đó có ý nghĩa. –

0

Kiểm tra điều kiện documentation.status!=3 của bạn ... nó có thể là thủ phạm .. đó là tôi nghĩ rằng việc loại bỏ hồ sơ dự kiến ​​của bạn.

Thông thường để gỡ rối vấn đề này chạy truy vấn của bạn trong phần, trước hết Run-

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber 

kiểm tra kết quả và sau đó chạy truy vấn với các nơi -

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber 
where documentation_reference.docnumber = 'TP-036' 

Kiểm tra kết quả họ nên thay đổi một lần bạn thêm kết quả cuối cùng ở nơi điều kiện - documentation.status!=3

Bạn có thể theo lời khuyên của Martin và chạy mã của anh ấy để có điểm kinh nghiệm kết quả ected.