表:客户
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
这提供了所需的输出。但是,是否有任何替代方法可以提供所需的输出并且比这更好?另外,我怎么知道哪一个会做得更好?
答案 0 :(得分: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)
子查询只返回在orders表中存在一次的customer_id。
或者这与上面类似,但JOIN
代替IN
:
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
答案 1 :(得分: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
答案 2 :(得分: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子句来只选择最近日期的订单。
答案 3 :(得分:0)
使用join
和Group 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
会阻止您获取多个值。