我有一个默认价格的产品表。
表:产品
id|product|price|
我有另一张促销表
表:促销活动
id|description|
还有另一张促销价格表
表:价格
id|product_id|promotion_id|price|
我想做的是:
获取产品,使用促销代码" 1"验证价格表中是否有价格。如果没有,请使用促销代码" 2"进行验证,如果仍然没有结果,请使用"产品"的结果价格。表
现在我可以在一个SQL中获取所有产品,然后为每个结果搜索价格,但我在Android SQLite数据库中处理大约23,000条记录并且处理时间不满意。
所以,我试着用这样的CASE:
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 :(得分:0)
尝试执行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)
答案 1 :(得分:0)
根据另一个答案中的建议使用左连接,下面的工作可能会稍快一些。这将返回价格表中的价格以及促销描述仅供参考,如果您不需要它,您可以在选择中删除该行,但它可能是方便的错误检查。
此外,在对同一产品进行更多促销活动并希望在价格/促销表中获得某种历史记录时,您可能会遇到问题。因此,为什么你可以注释掉明确选择promotion.id 1和2的最后一行。
左边的加入价格将显示产品的最高价格.id的价格。即可以在价格/促销表中添加新促销。
无论如何,这很有趣!另外,我使用表名价格和'
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
;