我有Products
upc | name | price | qty
----------------------------
1 | apple | 1.00 | 3
2 | peach | 2.00 | 7
3 | melon | 1.75 | 2
和SaleProducts
upc | price
------------
2 | 1.90
我想从产品中选择,但也要选择促销价 来自SaleProducts(如果产品正在销售中)。这就是我想出的:
SELECT t1.upc, t1.name, MIN(t1.price) AS 'price', t1.qty
FROM (
SELECT p.upc, p.name, p.price, p.qty
FROM products p
UNION
SELECT sp.upc, NULL, sp.price, NULL
FROM saleproducts sp
) t1
GROUP BY t1.upc;
输出:
upc | name | price | qty
----------------------------
1 | apple | 1.00 | 3
2 | peach | 1.90 | 7
3 | melon | 1.75 | 2
有人能建议更优雅的方式来实现这一目标吗?我知道similar question,但我的目标是获取较低的价格,因此COALESCE
无效。
唯一的限制是,我必须使用vanilla SQL,没有存储过程或IF。
答案 0 :(得分:1)
请尝试使用CASE
:
SELECT p.upc, p.name,
CASE WHEN sp.price IS NOT NULL
THEN CASE WHEN p.price > sp.price
THEN sp.price
ELSE p.price
END
ELSE p.price
END price, p.qty
FROM products p LEFT JOIN saleproducts sp ON p.upc = sp.upc;
当它可用时,它会优先使用saleproducts
的价格。如果该产品没有销售价格,则会使用products
的价格。
编辑 - 我更新了我的答案,以便始终获得最低价格。 FWIW我无法想象为什么你会打扰售价实际上高于你的定价。
答案 1 :(得分:0)
这似乎更像是left outer join
:
SELECT p.upc, p.name,
(case when sp.price is null or p.price < sp.upc then p.price
else sp.price
end) as price,
p.qty
FROM products p left outer join
salesproducts sp
on p.upc = sp.upc;