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

製品から選択したいだけでなく、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

これは、の仕事のようです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 に答える