簡體   English   中英

從兩個表中選擇並有條件地折疊一列

[英]select from two tables and conditionally collapse one column

我有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,沒有存儲的proc或IF。

嘗試使用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,我無法想象為什么您會煩惱實際上要高於標價的銷售價格。

這似乎更像是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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM