iT邦幫忙

2021 iThome 鐵人賽

DAY 30
0
自我挑戰組

Oracle資料庫系列 第 30

[Day30]檢視表、索引實作

在OE的order_items和product_infortation資料表中,依照產品被訂購次數由多至少查看產品名稱和被訂購次數,從未被訂購商品的名稱也要查看。
說明:

  1. 由於要搜尋的資料表有兩張:order_items和product_infortation,所以分類為複雜的資料表。
  2. 設檢視表名稱為product_sale_vu,欄位名稱分別為product_name, sale_amount,架構如下:
CREATE OR REPLACE VIEW product_sale_vu
(product_name, sale_amount)
AS 子查詢;
  1. 因為order_items內的資料表包含product_id和item_cnt,因此產品被訂購次數可以放在資料表內(product_id的次數計算而來)。而同一張訂單可同時下單多項產品,因此需要以product_id分組,再用count(*)計算。
SELECT product_id, COUNT(*) item_cnt
FROM order_items
GROUP BY product_id
  1. 由於product_name在product_infortation資料表中,因此需要將可查詢被曾訂購商品編號和被訂購次數的上述SQL語句中當成子查詢,並將product_infortation資料表合併,就可以在被訂購商品編號product_id找到品名。
  2. 另一方面,因為也要查詢從未被訂購過的產品名稱,所以要用RIGHT OUT JOIN把product_infortation資料表內無符合的訂購產品編號的產品名稱也合併(從未被訂購的商品)。
    完整SQL語句:
CREATE OR REPLACE VIEW product_sale_vu
(product_name, sale_amount) AS
SELECT p.product_name, NVL(i.item_cnt,0)
FROM (SELECT product_id, COUNT(*) item_cnt
FROM order_items
GROUP BY product_id) i
RIGHT OUTER JOIN product_information p
ON i.product_id = p.product_id
order by 2 desc;

https://ithelp.ithome.com.tw/upload/images/20211015/20140915xh4Iz50k23.png

搜尋:

SELECT *
FROM product_sale_vu
WHERE sale_amount>16;

https://ithelp.ithome.com.tw/upload/images/20211015/20140915FnUPcLTalG.png

最後一篇了!希望有幫助到對資料庫有疑問的人,有緣再見!


上一篇
[Day29]檢視表、索引
系列文
Oracle資料庫30

尚未有邦友留言

立即登入留言