2008-12-12 28 views
14

tôi đang gặp một vấn đề với việc tạo ra một truy vấn trong oracle mà doesnt dường như muốn tham gia vào các giá trị thiếuoracle trái bên ngoài tham gia không hiển thị đúng các giá trị rỗng

bảng tôi có được điều này:

table myTable(refnum, contid, type) 

values are: 
1, 10, 90000 
2, 20, 90000 
3, 30, 90000 
4, 20, 10000 
5, 30, 10000 
6, 10, 20000 
7, 20, 20000 
8, 30, 20000 

bảng phân tích về các lĩnh vực tôi sau này là:

select a.refnum from myTable a where type = 90000 
select b.refnum from myTable b where type = 10000 and contid in (select contid from myTable where type = 90000) 
select c.refnum from myTable c where type = 20000 and contid in (select contid from myTable where type = 90000) 

kết quả của truy vấn tôi sau này là:

a.refnum, b.refnum, c.refnum 

tôi nghĩ điều này sẽ làm việc:

select a.refnum, b.refnum, c.refnum 
from myTable a 
left outer join myTable b on (a.contid = b.contid) 
left outer join myTable c on (a.contid = c.contid) 
where a.id_tp_cd = 90000 
and b.id_tp_cd = 10000 
and c.id_tp_cd = 20000 

nên các giá trị nên là:

1, null, 6 
2, 4, 7 
3, 5, 8 

nhưng nó chỉ trở về:

2, 4, 7 
3, 5, 8 

Tôi nghĩ rời gia nhập sẽ hiển thị tất cả các giá trị ở bên trái và tạo một giá trị rỗng cho bên phải.

giúp đỡ :(

Trả lời

24

Bạn đang đúng khi nói rằng trái tham gia sẽ trở lại null cho quyền nơi có không phù hợp, nhưng bạn không cho phép những null để được trả lại khi bạn thêm sự hạn chế này để mệnh đề where của bạn :

and b.id_tp_cd = 10000 
and c.id_tp_cd = 20000 

Bạn sẽ có thể đặt những trong 'bật' khoản của join thay vào đó, hàng vì vậy chỉ phù hợp ở bên phải được trả về

select a.refnum, b.refnum, c.refnum 
from myTable a 
left outer join myTable b on (a.contid = b.contid and b.id_tp_cd = 10000) 
left outer join myTable c on (a.contid = c.contid and c.id_tp_cd = 20000) 
where a.id_tp_cd = 90000 
2

. Hoặc sử dụng cú pháp Oracle thay vì ansi

select a.refnum, b.refnum, c.refnum 
from myTable a, mytable b, mytable c 
where a.contid=b.contid(+) 
and a.contid=c.contid(+) 
and a.type = 90000 
and b.type(+) = 10000 
and c.type(+) = 20000; 


REFNUM  REFNUM  REFNUM 
---------- ---------- ---------- 
    1      6 
    2   4   7 
    3   5   8 
Các vấn đề liên quan