Как мне получить это Правильное внешнее соединение для работы? - PullRequest
0 голосов
/ 06 мая 2019

Я пытаюсь показать все заказы на продажу и, если они есть, накладную.У меня есть запрос, показывающий все заказы, но независимо от того, как я присоединяю его к следующей таблице, я продолжаю получать результаты только для заказов с накладными.Я хочу, чтобы NULL присутствовал для накладных, если их нет в записи.

Я пробовал левые, правые и внутренние соединения, и все они возвращают одинаковое количество результатов, что сбивает меня с толку.Я думал, что у меня было понимание объединений до сегодняшнего дня.

Эта часть показывает, сколько существует заказов на продажу.Я хочу, чтобы все результаты этого поиска отображались в следующем запросе

select t0.docnum SalesOrder, t1.itemcode, t1.linenum rdr1line
from ordr t0 inner join rdr1 t1 on t1.docentry = t0.docentry
where t0.CANCELED = 'N';

В этой части показано, сколько заказов на продажу существует с накладной, но не включает заказы, для которых нет накладных.

select t0.docnum SalesOrder, t1.itemcode, t2.docnum DelivNoteNum, t3.baseline inv1base, t1.linenum rdr1line, t3.linenum dln1line
from ordr t0 inner join rdr1 t1 on t1.docentry = t0.docentry
right outer join odln t2 on t2.docentry = t1.trgetentry
right outer join dln1 t3 on t3.docentry = t2.docentry and t3.baseline = t1.linenum and t3.ItemCode = t1.ItemCode
where t0.CANCELED = 'N' and t2.canceled = 'N';

Ожидаемые результаты должны содержать одинаковое количество строк в каждой таблице.Фактические результаты заказываются только с накладными.

1 Ответ

0 голосов
/ 06 мая 2019

Используйте left join, а не right join.Если вы хотите все заказы, начните с этой таблицы.Фильтры в последующих таблицах должны входить в предложение on:

select t0.docnum SalesOrder, t1.itemcode, t2.docnum DelivNoteNum,
       t3.baseline inv1base, t1.linenum rdr1line, t3.linenum dln1line   
from ordr t0 left join
     rdr1 t1
     on t1.docentry = t0.docentry left join
     odln t2
     on t2.docentry = t1.trgetentry and t2.canceled = 'N' left join
     dln1 t3
     on t3.docentry = t2.docentry and
        t3.baseline = t1.linenum and
       t3.ItemCode = t1.ItemCode
where t0.CANCELED = 'N';
...