テーブルの注文を想定する
CREATE TABLE Orders (
order_id int(11),
customer_id int(11),
purchase_date datetime
)
次のレポートが必要です。今月より前に注文しなかった顧客の場合、顧客ごとに何件の注文がありましたか。
これが私が現在使用している非常に遅いSQLです:
SELECT count(order_id) num_of_orders, customer_id
FROM (SELECT order_id, customer_id
FROM orders
WHERE customer_id NOT IN (SELECT DISTINCT customer_id
FROM orders
WHERE purchase_date < '2019-03-01')) a
GROUP BY customer_id;
このクエリを書くためのより速く/より効率的な方法はありますか?
私はそれを次のように書き直します:
SELECT COUNT(order_id), customer_id
FROM orders o
WHERE NOT EXISTS (SELECT 1 FROM orders o1 WHERE o1.customer_id = o.customer_id AND o1.purchase_date < '2019-03-01')
GROUP BY customer_id;
これにより、orders(customer_id
)のインデックスにより、パフォーマンスが向上します。
ただし、orders
テーブルにnull
forが含まれているcustomer_id
場合、NOT IN
サブクエリはを返しnull
ます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加