假設我有兩張桌子:
CREATE TABLE products
(
product_id NUMBER PRIMARY KEY,
available_from DATE NOT NULL
);
CREATE TABLE orders
(
order_id NUMBER PRIMARY KEY,
product_id NUMBER NOT NULL,
quantity NUMBER NOT NULL,
dispatch_date DATE NOT NULL,
FOREIGN KEY (product_id) REFERENCES products(product_id)
);
查找去年銷量少于 20 件的產品(即該產品過去一年的訂單數量總和少于 20 個)的最有效方法是什么,不包括上市時間少于 1 個月的產品?
我目前的解決方案是:
SELECT products_old.product_id,
COALESCE(SUM(orders_past_year.quantity), 0) AS sold_past_year
FROM (SELECT order_id,
product_id,
quantity
FROM orders
WHERE orders.dispatch_date >= ADD_MONTHS(SYSDATE, -12)) orders_past_year
RIGHT JOIN (SELECT product_id
FROM products
WHERE products.available_from <= ADD_MONTHS(SYSDATE, -1))
products_old
ON orders_past_year.product_id = products_old.product_id
GROUP BY products_old.product_id
HAVING COALESCE(SUM(orders_past_year.quantity), 0) < 20;
但我不確定這有多有效?
謝謝你的幫助!
uj5u.com熱心網友回復:
您的查詢看起來不錯;但是,它可以以更簡單的格式撰寫,無需對 products 表進行子查詢,并使用LEFT JOIN將驅動表放在首位的 a(這對代碼的運行方式沒有影響,但開發人員可能更容易理解)。
SELECT p.product_id,
COALESCE(SUM(o.quantity), 0) AS sold_past_year
FROM products p
LEFT OUTER JOIN (
SELECT product_id,
quantity
FROM orders
WHERE dispatch_date >= ADD_MONTHS(SYSDATE, -12))
) o
ON (o.product_id = p.product_id)
WHERE p.available_from <= ADD_MONTHS(SYSDATE, -1))
GROUP BY p.product_id
HAVING COALESCE(SUM(o.quantity), 0) < 20;
與EXPLAIN PLAN您的代碼相比,它是相同的。db<>小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/424978.html
標籤:sql 甲骨文 表现 oracle11g 数据库管理系统
上一篇:選擇查詢一對多關系表
