关于 SQL group by 和 having 的面试问题
Interview Question about SQL group by and having
此问题来自以下
假设我们有两个表:
Salesperson
ID Name Age Salary
Orders
Number order_date cust_id salesperson_id Amount
问题如下:
我们想从上表中检索所有拥有超过 1 个订单的销售人员的姓名。您可以假设每个销售人员只有一个 ID。我可能还会假设名称都是不同的。
我的回答是这样的。
select Name from
salesperson S inner join Orders O
on S.ID=O.salesperson_id
group by Name
having count(number) >=2
然而,给出的答案如下:
SELECT Name
FROM Orders inner join Salesperson
On Orders.salesperson_id = Salesperson.ID
GROUP BY salesperson_id, NAME
Having count(salesperson_id) > 1
如果 name 和 salesperson_id 是一对一的,我们有什么理由必须在此处将 salesperson_id 添加到 group by 语句中?另外,如果 name 和 salesperson_id 的关系只是一对一,如果我们按 salesperson_id、name?
分组,count(salesperson_id) 不会总是 1
我对此有点困惑,我想知道以前是否有人遇到过这个问题并且也觉得这很奇怪。
除了 GROUP BY
子句外,您的解决方案和已接受的解决方案在功能上完全相同。
接受的解决方案被 Name
和 salesperson_id
聚合的可能原因是两个或更多销售人员碰巧有相同的名字。如果发生这种情况,您的查询将只报告一个姓名,但包含来自多个销售人员的汇总结果。但是,salesperson_id
和 Name
的组合应该始终是唯一的。
除此之外,我实际上更喜欢你的版本,我会从 salesperson
table 开始加入 Orders
table。
此问题来自以下
假设我们有两个表:
Salesperson
ID Name Age Salary
Orders
Number order_date cust_id salesperson_id Amount
问题如下:
我们想从上表中检索所有拥有超过 1 个订单的销售人员的姓名。您可以假设每个销售人员只有一个 ID。我可能还会假设名称都是不同的。
我的回答是这样的。
select Name from
salesperson S inner join Orders O
on S.ID=O.salesperson_id
group by Name
having count(number) >=2
然而,给出的答案如下:
SELECT Name
FROM Orders inner join Salesperson
On Orders.salesperson_id = Salesperson.ID
GROUP BY salesperson_id, NAME
Having count(salesperson_id) > 1
如果 name 和 salesperson_id 是一对一的,我们有什么理由必须在此处将 salesperson_id 添加到 group by 语句中?另外,如果 name 和 salesperson_id 的关系只是一对一,如果我们按 salesperson_id、name?
分组,count(salesperson_id) 不会总是 1我对此有点困惑,我想知道以前是否有人遇到过这个问题并且也觉得这很奇怪。
除了 GROUP BY
子句外,您的解决方案和已接受的解决方案在功能上完全相同。
接受的解决方案被 Name
和 salesperson_id
聚合的可能原因是两个或更多销售人员碰巧有相同的名字。如果发生这种情况,您的查询将只报告一个姓名,但包含来自多个销售人员的汇总结果。但是,salesperson_id
和 Name
的组合应该始终是唯一的。
除此之外,我实际上更喜欢你的版本,我会从 salesperson
table 开始加入 Orders
table。