2011-08-17 47 views
0

我有大的Oracle查詢,但我想有一個RIGHT JOIN在下面的代碼行,我試圖用(+),但不工作:在Oracle查詢RIGHT JOIN

AND SUBSTR(IBT_LINE.USER_1, 0, INSTR(IBT_LINE.USER_1, '-', +1, 3)-1) = 
    SUBSTR(WORK_ORDER.USER_1, 0, INSTR(WORK_ORDER.USER_1, '-', +1, 3)-1) 

總查詢:

FROM 
    CUSTOMER_ORDER, IBT, IBT_LINE,PART, WORK_ORDER 
WHERE 
    CUSTOMER_ORDER.ID = REPLACE(IBT.ID,'X','C') 
    AND IBT.ID = IBT_LINE.IBT_ID 
    AND IBT_LINE.PART_ID=PART.ID 
    AND SUBSTR(IBT_LINE.USER_1, 0, INSTR(IBT_LINE.USER_1, '-', +1, 3)-1) = SUBSTR(WORK_ORDER.USER_1, 0, INSTR(WORK_ORDER.USER_1, '-', +1, 3)-1) 
    AND WORK_ORDER.WAREHOUSE_ID ='MEX-04' AND WORK_ORDER.STATUS ='R' 
+2

您使用的是哪個版本的Oracle?爲什麼不使用JOIN語法而不是(+)? – 2011-08-17 21:04:27

+0

你想要檢索多少行? – Randy

+0

我試圖使用JOIN,但不起作用。我想從WORK_ORDER表中獲取所有信息,即使IBT_LINE表上不存在類似的聯合代碼。 –

回答

1

這是不可能做到的左/右兩個表連接,並在同一選擇在該表的字段的必需值。 您的問題不在於sintax(+或JOIN),您的問題與您的選擇有關。

你正在試圖獲得外部聯接在WORK_ORDER和IBT_LINE,但是你告訴甲骨文做這句話完整的加盟:

.... 和WORK_ORDER.WAREHOUSE_ID ='MEX-04 'AND WORK_ORDER.STATUS =' R」

您可以在FROM嘗試一個子查詢,

.... 
FROM 
    CUSTOMER_ORDER, IBT, IBT_LINE,PART, 
    (SELECT SUBSTR(WORK_ORDER.USER_1, 0, INSTR(WORK_ORDER.USER_1, '-', +1, 3)-1) user_1_formatted 
       from WORK_ORDER 
       where WORK_ORDER.WAREHOUSE_ID ='MEX-04' 
       AND WORK_ORDER.STATUS ='R') sub_work_order 
WHERE 
CUSTOMER_ORDER.ID = REPLACE(IBT.ID,'X','C') 
    AND IBT.ID = IBT_LINE.IBT_ID 
    AND IBT_LINE.PART_ID=PART.ID 
    AND SUBSTR(IBT_LINE.USER_1, 0, INSTR(IBT_LINE.USER_1, '-', +1, 3)-1) = sub_work_order.user_1_formatted(+) 

或子查詢,然後篩選結果,如你所願。

select * 
from (select ... from 
    CUSTOMER_ORDER, IBT, IBT_LINE,PART, WORK_ORDER 
WHERE 
    CUSTOMER_ORDER.ID = REPLACE(IBT.ID,'X','C') 
    AND IBT.ID = IBT_LINE.IBT_ID 
    AND IBT_LINE.PART_ID=PART.ID 
    AND SUBSTR(IBT_LINE.USER_1, 0, INSTR(IBT_LINE.USER_1, '-', +1, 3)-1) = SUBSTR(WORK_ORDER.USER_1, 0, INSTR(WORK_ORDER.USER_1, '-', +1, 3)-1) (+)) 
    where (work_order is null or (WORK_ORDER.WAREHOUSE_ID ='MEX-04' AND WORK_ORDER.STATUS ='R'))