SQL QUERY

时间:2016-06-06 03:06:05

标签: android sql case

我有一个默认价格的产品表。

表:产品

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

但是,它的表现仍然很慢。

有人可以用另一种方法克服这个问题吗?

2 个答案:

答案 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
    ;