Выберите записи, которые еще не объединены и являются уникальными, основываясь на некоторых столбцах - PullRequest
0 голосов
/ 02 марта 2020

Мне действительно трудно express четко обозначить мою проблему в заголовке в одном предложении. Но вот объяснение и примеры данных:

https://www.db-fiddle.com/f/tfamoNxujZhfTzxPPzefLt/2

create table customer_promotions (
customer_id integer, 
promotion_id integer);

create table promotions (
  promotion_id integer,
  type text,
  product_type text,
  percentage integer);

  insert into customer_promotions values 
  (1,1), 
  (1,5), 
  (2,3),
  (2,4),
  (3,6),
  (4,2);
  insert into promotions values 
  (1,'fixed_value', 'food',5),
   (2,'fixed_value', 'food',10),
    (3,'percentage', 'food',10),
     (4,'percentage', 'clothes',10),
      (5,'fixed_value', 'electronics',20),
       (6,'percentage', 'electronics',10),
        (7,'fixed_value', 'toys',15);

Я хочу найти все рекламные акции для конкретного клиента (скажем, customer_id = 1), что еще не используются (присутствуют в таблице customer_promotions) И не разделяют те же type и product_type, которые уже используются.

Поэтому для клиента 1 должен быть результат: promo_id 3 4 6 7 Я считаю, есть какое-то простое решение с использованием левого соединения, но сейчас я имею в виду черную дыру. Был бы очень признателен за помощь.

Ответы [ 2 ]

1 голос
/ 02 марта 2020

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

select unused.promotion_id, unused.type 
from promotions unused 
left join 
(  
   select promotions.promotion_id, promotions.type, promotions.product_type 
   from promotions inner join customer_promotions 
                   on customer_promotions.promotion_id = promotions.promotion_id
   where customer_id = 1
) used 
         on unused.type = used.type 
            and unused.product_type = used.product_type
where used.promotion_id is null
1 голос
/ 02 марта 2020

Вы можете сделать это с помощью: Ваши поля type и product_type делают их varchar (100) вместо текста.

   select * from promotions a 
   where not exists(select 1 from customer_promotions b 
   where a.promotion_id = b.promotion_id and b.customer_id = 1)
   and not exists
   (select 1 from promotions aa inner join 
   customer_promotions bb on aa.promotion_id = bb.promotion_id 
   where a.type = aa.type and a.product_type  = aa.product_type and bb.customer_id = 1)

Вывод:

promotion_id    type        product_type    percentage
3             percentage    food            10
4             percentage    clothes         10
6             percentage    electronics     10
7             fixed_value   toys            15
...