【发布时间】:2014-08-21 16:46:15
【问题描述】:
考虑以下公司数据库的架构(主键以粗体显示)。
Employee (**EmployeeID**, Name, Office, Email, Sex, Salary, DepartmentID)
Department (**DepartmentID**, DepartmentName)
Project (**ProjectID**, DepartmentID, Duration)
EmployeeProject (**EmployeeID, ProjectID**, WorkHours)
用SINGLE QUERY语句查找总工时第二长的项目。 尽量不要使用 top 或 limit。
以下是我的解决方案,它相当丑陋且效率低下。
select projectid
from (
select projectid, sum(workhours) as hours
from employeeproject ep
group by projectid
) sum
where hours = (
select max(hours)
from (
select projectid, hours
from (
select projectid, sum(workhours) as hours
from employeeproject ep
group by projectid
) sum
where hours < (
select max(hours)
from (
select projectid, sum(workhours) as hours
from employeeproject ep
group by projectid
) sum
)
) sec
)
【问题讨论】:
-
您尝试过哪些无效的解决方案?
-
好像是作业或者面试题……
-
格式化问题实际上并没有帮助。
-
是的,这是一道考试题,但可以问对吧?还是不行?
-
可以问...可以用伪答案吗?我尽量避免 where in () 逻辑,而是更喜欢加入子查询。创建一个按 projectID 获取小时总和的最大查询...将其连接到选择最大小时值的子查询。有一个 where 子句来过滤掉子查询为空的位置(有效地过滤掉最长的项目)......从中选择 max 以获得第二长。这是一些嵌套的子查询,但我会在 where in / where not in route 之前走那条路线