2016-06-06 1 views
0

У меня есть таблица продуктов по умолчанию.Несколько CASE в SQL QUERY

ТАБЛИЦА: продукты

id|product|price| 

У меня есть еще один стол для рекламных акций

ТАБЛИЦЫ: рекламные акции

id|description| 

И есть другая таблица с ценами на акции

ТАБЛИЦА: цены

id|product_id|promotion_id|price| 

Что я пытаюсь сделать, это:

Получить продукт, проверьте, есть ли цена в таблице цен с кодом акции «1». Если нет, проверьте с помощью кода промо-акции «2» и, если по-прежнему нет результатов, используйте цену по умолчанию из таблицы «товары».

Теперь я могу получить все продукты в одном SQL, а затем для каждого поиска результата по цене, но я работаю с примерно 23 тысячами записей в базе данных Android SQLite, и время обработки не является удовлетворительным.

Итак, я попытался с футляром, как это:

SELECT product, 
    CASE 
     WHEN EXISTS (SELECT price FROM price p1 WHERE p1.product_id = prod.id AND p1.promotion_id = 1) 
     THEN (SELECT price FROM price p1 WHERE p1.product_id = prod.id AND p1.promotion_id = 1) 
     WHEN EXISTS (SELECT price FROM price p1 WHERE p1.product_id = prod.id AND p1.promotion_id = 2) 
     THEN (SELECT price FROM price p1 WHERE p1.product_id = prod.id AND p1.promotion_id = 2) 
     ELSE price 
    END, 
FROM products prod 

Но это по-прежнему очень медленно производительности.

Возможно, у кого-то есть другой способ преодолеть это?

ответ

0

Try делает условную агрегацию LEFT JOIN и:

SELECT 
    prod.product, 
    CASE 
     WHEN MAX(CASE WHEN pr.promotion_id = 1 THEN pr.price END) IS NOT NULL 
      THEN MAX(CASE WHEN pr.promotion_id = 1 THEN pr.price END) 
     WHEN MAX(CASE WHEN pr.promotion_id = 2 THEN pr.price END) IS NOT NULL 
      THEN MAX(CASE WHEN pr.promotion_id = 2 THEN pr.price END) 
     ELSE 
      prod.price 
    END 
FROM products prod 
LEFT JOIN price pr 
    ON pr.product_id = prod.id 
    AND pr.promotion_id IN (1, 2) 
0

ниже может работать немного быстрее, используя LEFT JOIN, как это рекомендовано в другой ответ. Это вернет цену в таблице цен, а также описание продвижения просто FYI, вы можете удалить эту строку в select, если вам это не нужно, но это может быть удобной проверкой ошибок.

Кроме того, у вас могут возникнуть проблемы, когда вы делаете больше рекламных акций на одних и тех же продуктах и ​​хотите иметь какую-то историческую запись в таблице цен/рекламных акций. Отсюда почему вы можете прокомментировать последнюю строку, которая явно выбирает promotionions.id 1 и 2.

В левом столбце цены будут отображаться цены на самые высокие цены. Для продукта. Т.е. добавление новых рекламных акций в таблицу цен/рекламных акций возможно.

В любом случае, это было весело! Также NB Я использовал цены на имя таблицы с цифрами 's'

select 
    products.product as `Product Name`, 
    ifnull(case 
       when prices.id is not null 
        then promotions.description 
      end, "No Promotion") as `Promotion Description`, 
    case 
     when prices.id is not null 
      then prices.price 
     else products.price 
    end as `List Price` 

from products 
left join prices 
    on products.id=prices.product_id 
    and prices.id=(select max(id) from prices where product_id=products.id) -- change max(id) to max(promotion_id) if the latest promos are by the promotions primary key 
left join promotions 
    on prices.promotion_id=promotions.id 
    and prices.promotion_id in ('1','2') -- can comment out this line to select the latest promotion based in the join to prices above 
    ; 
+0

Извините, что не выбрал свой ответ. Мне нравится способ, которым также была добавлена ​​таблица рекламных акций, но сначала ответил @felix. – Eduvm

+0

Не потейте об этом. Просто рад помочь. Не слишком беспокоился о правильном/неправильном: P надеюсь, что это сработало для вас и дало вам идеи – brett

 Смежные вопросы

  • Нет связанных вопросов^_^