В 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