Как извлечь записи из таблицы, которая не существует для клиента specefi c? - PullRequest
0 голосов
/ 27 марта 2020

У меня следующая ситуация в таблице (CUST_CONTACTS).

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

ТЕКУЩИЙ СТОЛ

CUSTOMER ID   OFFERNAME    PACKAGE    INSERT_DATE
-------------------------------------------------
CUST1         OfferA       123        27-Mar-2020
CUST1         OfferB       456        27-Mar-2020
CUST1         OfferC       100        27-Mar-2020
CUST2         OfferA       123        27-Mar-2020

ТРЕБУЕМЫЙ РЕЗУЛЬТАТ:

CUSTOMER ID   OFFERNAME    PACKAGE    INSERT_DATE
-------------------------------------------------
CUST1         OfferA       123        27-Mar-2020
CUST1         OfferB       456        27-Mar-2020
CUST1         OfferC       100        27-Mar-2020
CUST2         OfferB       456        27-Mar-2020
CUST2         OfferC       100        27-Mar-2020

Я написал следующий запрос, но это не так работает (без учета записей). Этот запрос правильный?

select * from CUST_CONTACTS A
LEFT JOIN CUST_CONTACTS B ON  B.OFFERNAME = A.OFFERNAME and B.PACKAGE = A.PACKAGE  
WHERE A.OFFERNAME is null and TRUNC(A.DT_INSERT) = TRUNC(SYSDATE) and TRUNC(B.DT_INSERT) = TRUNC(SYSDATE) AND A.CUSTOMER_ID = 'CUST1' AND B.CUSTOMER_ID = 'CUST2'

Ответы [ 2 ]

0 голосов
/ 28 марта 2020

Вы можете просто использовать оператор MINUS и UNION следующим образом:

SQL> WITH YOUR_TABLE ( ID, OFFER, PKG, DATUM )  AS -- sample data
  2  (select 'CUST1', 'OfferA', 123, date '2020-03-27' from dual union all
  3  select 'CUST1', 'OfferB', 456, date '2020-03-27' from dual union all
  4  select 'CUST1', 'OfferC', 100, date '2020-03-27' from dual union all
  5  select 'CUST2', 'OfferA', 123, date '2020-03-27' from dual
  6  )  --your query starts from here
  7  SELECT ID, OFFER, PKG, DATUM FROM YOUR_TABLE WHERE ID = 'CUST1'
  8  UNION
  9  SELECT 'CUST2' AS ID, OFFER, PKG, DATUM FROM YOUR_TABLE WHERE ID = 'CUST1'
 10  MINUS
 11  SELECT ID, OFFER, PKG, DATUM FROM YOUR_TABLE WHERE ID = 'CUST2';

ID    OFFER         PKG DATUM
----- ------ ---------- ---------
CUST1 OfferA        123 27-MAR-20
CUST1 OfferB        456 27-MAR-20
CUST1 OfferC        100 27-MAR-20
CUST2 OfferB        456 27-MAR-20
CUST2 OfferC        100 27-MAR-20

SQL>
0 голосов
/ 27 марта 2020

Вот один из вариантов.

SQL> with test (id, offer, pkg, datum) as
  2    -- sample data
  3    (select 'c1', 'ofa', 123, date '2020-03-27' from dual union all
  4     select 'c1', 'ofb', 456, date '2020-03-27' from dual union all
  5     select 'c1', 'ofc', 100, date '2020-03-27' from dual union all
  6     select 'c2', 'ofa', 123, date '2020-03-27' from dual
  7    ),
  8  diff as
  9    -- C1 that doesn't have its match in C2
 10    (select 'c2' id, offer, pkg, datum
 11       from test where id = 'c1' and datum = trunc(sysdate)
 12     minus
 13     select 'c2' id, offer, pkg, datum
 14       from test where id = 'c2' and datum = trunc(sysdate)
 15    )
 16  -- Final result
 17  select id, offer, pkg, datum
 18  from test
 19  where id = 'c1'
 20    and datum = trunc(sysdate)
 21  union all
 22  select id, offer, pkg, datum
 23  from diff
 24  order by id, offer;

ID OFF        PKG DATUM
-- --- ---------- ----------
c1 ofa        123 27.03.2020
c1 ofb        456 27.03.2020
c1 ofc        100 27.03.2020
c2 ofb        456 27.03.2020
c2 ofc        100 27.03.2020

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...