1

我有一个清单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

我想从 Products 中选择,还想从 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

任何人都可以提出一种更优雅的方式来实现这一点吗?我知道类似的问题,但我的目标是抓住价格较低的那个,所以COALESCE行不通。

唯一的限制是,我必须使用普通 SQL,没有存储过程或 IF。

4

2 回答 2

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 我无法想象为什么你会费心让销售价格实际上高于你的标价。

于 2013-07-23T21:47:53.077 回答
0

这似乎更像是 a 的工作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;
于 2013-07-23T22:45:06.253 回答