ПРАВИЛЬНОЕ СОЕДИНЕНИЕ в запросе Oracle - PullRequest
0 голосов
/ 18 августа 2011

У меня большой запрос 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'

1 Ответ

1 голос
/ 18 августа 2011

Невозможно выполнить правое / левое соединение с двумя таблицами, и иметь обязательное значение для поля этой таблицы в одном и том же выборе. Ваша проблема не в синтаксисе (+ или JOIN), а в выборе.

Вы пытаетесь получить внешнее соединение в WORK_ORDER и IBT_LINE, но вы говорите оракулу сделать полное соединение с этим предложением:

.... AND WORK_ORDER.WAREHOUSE_ID = 'MEX-04' И WORK_ORDER.STATUS = 'R'

Вы можете попробовать подвыбрать в своем ОТ,

....
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'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...