2016-08-17 10 views
3

表:カスタマー他の方法でこのクエリを解決できますか?

customer_id cust_name  city  grade  salesman_id 
----------- ------------ ---------- ---------- ----------- 
3002   Nick Rimando New York 100   5001 
3005   Graham Zusi California 200   5002 
3001   Brad Guzan London     5005 
3004   Fabian Johns Paris  300   5006 
3007   Brad Davis New York 200   5001 
3009   Geoff Camero Berlin  100   5003 
3008   Julian Green London  300   5002 
3003   Jozy Altidor Moncow  200   5007 

表:注文

ord_no  purch_amt ord_date customer_id salesman_id 
---------- ---------- ---------- ----------- ----------- 
70001  150.5  2012-10-05 3005   5002 
70009  270.65  2012-09-10 3001   5005 
70002  65.26  2012-10-05 3002   5001 
70004  110.5  2012-08-17 3009   5003 
70007  948.5  2012-09-10 3005   5002 
70005  2400.6  2012-07-27 3007   5001 
70008  5760  2012-09-10 3002   5001 
70010  1983.43  2012-10-10 3004   5006 
70003  2480.4  2012-10-10 3009   5003 
70012  250.45  2012-06-27 3008   5002 
70011  75.29  2012-08-17 3003   5007 
70013  3045.6  2012-04-25 3002   5001 

私は複数の現在の注文で各顧客の名前と番号を生成し、クエリを必要としています。

私の試み: -

SELECT customer_id, cust_name 
FROM customer a 
WHERE (SELECT COUNT (*) 
     FROM orders b 
     WHERE a.customer_id = b.customer_id) > 1 

これは、所望の出力を提供します。しかし、望ましい出力を与え、これよりも優れた性能を発揮する代替手段がありますか?また、どれが良くなるかをどのように知ることができますか?

+1

「どの人がもっとうまくいくかわかりますか?特定のインデックスを持つ実際の実データがあり、パフォーマンス*要件*が何であるかを知っているだけです。すべての状況で盲目的に適用されるワンサイズのルールを見ないでください。 –

答えて

3

私はこれを試してみた:

SELECT customer_id, cust_name 
FROM customer a 
WHERE customer_id IN (SELECT customer_id 
         FROM orders b 
         GROUP BY customer_id 
         HAVING COUNT(*) > 1) 

サブクエリは、単に受注テーブルにもう一度1を存在CUSTOMER_ID年代を返します。

またはこの、上記と同様、代わりINJOIN

SELECT a.customer_id, a.cust_name 
FROM customer a 
JOIN (SELECT customer_id 
     FROM orders b 
     GROUP BY customer_id 
     HAVING COUNT(*) > 1) b ON a.customer_id = b.customer_id 
+0

あなたの答えを説明してください。それは主に単なるコードです。 – Mfusiki

+2

@Mfusiki、自己説明的ではないですか? – jarlh

0

使用joinGroup byは:

SELECT customer_id, cust_name 
FROM customer a join order a.customer_id = b.customer_id 
Group by customer_id, cust_name 

joinは、注文テーブル内のレコードを持っている顧客を返します。 Group byは、複数の注文がある場合に複数の値を取得することを防止します。

3

あなたは内側のクエリとして複数の注文を顧客にフィルタリングクエリを持っていないし、それに参加することができます:

SELECT c.customer_id, c.cust_name 
FROM customer c 
JOIN (SELECT customer_id 
     FROM  orders 
     GROUP BY customer_id 
     HAVING COUNT(*) > 1) o ON c.customer_id = o.customer_id 
+0

長期的にはどちらが優れていますか?これを見つける方法はありますか? – BlackCat

1

サブクエリでINを用ませ実際の必要性を。
これは、結合を介して行うことができます。

SELECT o.customer_id, c.cust_name, count(*) as total 
FROM orders o 
LEFT JOIN customer c ON (o.customer_id = c.customer_id) 
GROUP BY o.customer_id, c.cust_name 
HAVING count(*) > 1; 

どのクエリが優れているかを比較しますか?クエリ実行計画の取得については、this old postを参照してください。

しかし、現在の注文が必要な場合は、最近の日付の注文のみを選択するためにwhere句を追加することをお勧めします。

関連する問題