2015-10-05 3 views
1

У меня есть таблица с ценами на продукцию. Существует два типа цен: A = цена предложения, B = стандартная цена. Пример:Эксклюзивная дизъюнкция

product_id | price | price_type 
------------------------------------- 
001   | 0.99 | A 
001   | 1.49 | B 

Я ищу для Select-оператора, который возвращает

  • стандартная цена (тип B), если нет цены предложения (тип А) для данного продукта,
  • цена предложения (тип A), когда продукт имеет цену типа A (не учитывается, если цена типа B поддерживается или нет).

Для моего примера данных выше заявления должен вернуть цену предложения = 0,99 = тип A.

+0

hv u попробовал что-то? Plz не просим нас делать домашнее задание ур. – Bikku

ответ

2

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

select p1.product_id, 
     coalesce(p2.price, p1.price) as price 
    from product_prices p1 
    left join product_prices p2 
    on p2.product_id = p1.product_id 
    and p2.price_type = 'A' 
where p1.price_type = 'B' 
2

Вы могли бы оставили присоединиться два запроса на столе и использовать coalesce, чтобы определить, есть ли предложение или нет:

SELECT b.product_id, COALESCE(a.price, b.price) 
FROM  (SELECT product_id, price 
      FROM products 
      WHERE price_type = 'B') b 
LEFT JOIN (SELECT product_id, price 
      FROM products 
      WHERE price_type = 'A') a ON a.product_id = b.product_id 
0

Основываясь на вашем примере, это может быть сделано:

выберите * из продукта где price_type in (выберите min (price_type) из группы товаров по product_id);

+0

Это действительно работает только с двумя строками, которые публикуются OP. Как только вы добавите больше данных с большим количеством идентификаторов продуктов, это не сработает. – sstan

+0

Вы правы. Как я уже сказал, это основано на примере OP. –