Что я делаю неправильно в этом запросе выбора с левым соединением и фильтрами? - PullRequest
0 голосов
/ 19 июня 2019

В Actian PSQL v13:

Я пытаюсь объединить две таблицы и отфильтровать набор результатов по нескольким критериям.Одна таблица - история продаж клиентов.Другая таблица связывает клиентов с группами покупок.Не все клиенты входят в группу покупателей, поэтому я делаю объединение влево, чтобы получить все возможные результаты по истории продаж.Я НЕ хочу, чтобы результаты включали кого-либо в группу покупок 'SALREP', но я хочу видеть клиентов, которые не входят ни в одну из групп покупок.Кроме того, так называемая часть «FREIGHT» отфильтровывается по результатам.

Проблема, с которой я сталкиваюсь, заключается в том, что при фильтрации группы «SALREP» только клиенты, которые входят в группу покупкиотбираются;все клиенты, не входящие в группу покупок, отсутствуют.

Я проверил это, закомментировав фильтр для 'SALREP', и набор результатов действительно включает клиентов, которые не входят в группу покупок.Я также пытался использовать другой подход фильтра, на случай, если Actian PSQL требователен.Например, я пробовал разные методы «не равных», такие как !=, not() и <>;проблема сохраняется.Кроме того, я использовал left join и left outer join с той же проблемой.

Вот запрос:

select T2.GROUP_CUST, T1.DATE_INVOICE, T1.SALESPERSON, T1.CUSTOMER, T1.PRODUCT_LINE, T1.PART, T1.DESCRIPTION, T1.QTY_SHIPPED, T1.EXTENSION 
from ORDER_HIST_LINE T1 
left join BUYING_GROUP T2 on T1.CUSTOMER=T2.CUSTOMER 
where DATE_INVOICE > '2019-06-13' and PART != 'FREIGHT'
and T2.GROUP_CUST != 'SALREP' 
and T1.CUSTOMER in ('ABC', 'DEF', 'GHI')
order by T1.CUSTOMER;

Ожидаемый набор результатов должен включать все, что было выставлено после 2019-06-13, не включайте часть под названием «FREIGHT» и не иметь клиентов в группе под названием «SALREP».Однако фактический набор результатов является неполным.Например:

CUSTOMER | GROUP_CUST | DATE_INVOICE  | PART   | etc.
-----------------------------------------------------
ABC      |  A12       |  2019-06-14   | WIDGET
DEF      |  A12       |  2019-06-14   | GEAR

В основном все клиенты, не входящие ни в одну группу покупок, не учитываются.

Закомментируйте часть and T2.GROUP_CUST != 'SALREP' и ожидаемые результаты найдены.Например:

CUSTOMER | GROUP_CUST | DATE_INVOICE  | PART   | etc.
-----------------------------------------------------
ABC      |  A12       |  2019-06-14   | WIDGET
DEF      |  A12       |  2019-06-14   | GEAR
GHI      |            |  2019-06-15   | WIDGET

Я думал о создании левого соединения с запросом на выборку, которое сначала удаляет SALREP из групп покупки, но не позволяет идентифицировать набор результатов иудалить кого-либо из этой группы.Пример: left join (select * from BUYING_GROUP where GROUP_CUST != 'SALREP') T2

1 Ответ

1 голос
/ 19 июня 2019

Необходимо указать условия для таблицы second в предложении ON.Единственное очевидное указание - T2.GROUP_CUST, но оно также может применяться к DATE_INVOICE и PART:

from ORDER_HIST_LINE T1 left join
     BUYING_GROUP T2
     on T1.CUSTOMER = T2.CUSTOMER and
        T2.GROUP_CUST <> 'SALREP'
where DATE_INVOICE > '2019-06-13' and
      PART <> 'FREIGHT' and
      T1.CUSTOMER in ('ABC', 'DEF', 'GHI')
order by T1.CUSTOMER;
...