我目前正在开发一个数据库项目,并且在连接表方面遇到一些问题。初始情况是:
四张桌子:
- 任务 t ~ 50000 条记录
- 项目 p ~ 1000 条记录
- Workson w ~ 30000 条记录
- 员工 e ~ 10000 条记录
表 w 有一个名为“WORKLOAD”的属性,不幸的是 SUM(w.WORKLOAD) 的结果不是预期的结果:
SELECT
p.NAME,
SUM(w.WORKLOAD) AS "Total Workload",
COUNT(DISTINCT w.ESSN) AS "Total Employees",
COUNT(DISTINCT t.NAME) AS "Finished Tasks" --t.NAME is unique
from p
JOIN w ON(p.PNUMBER = w.PNO)
JOIN t ON(p.PNUMBER = t.PNO)
WHERE t.END_DATE is NOT NULL
GROUP BY p.PNUMBER, p.NAME
连接这些表后,SUM() 函数返回一个太大的值。我猜这是因为 SUM() 函数多次计算每个 w.WORKLOAD 值。
那么有没有像内连接这样的连接操作可以在不使用子查询的情况下解决问题呢?
提前致谢 :-)
问题在于笛卡尔积(其中一个表中的行乘以其他表中的行)。以下方法所做的假设是,每个项目都有分配了员工的工作负载(所有这些工作负载都代表所有员工,因为您的查询不显示与员工表的联接)和任务。如果情况并非如此,请考虑执行外连接而不是内连接。
这个想法是根据项目编号在其自己的派生表中执行每个聚合。然后,我们可以按项目编号连接每个派生表以获得有意义的结果。
SELECT
p.NAME,
w.workload_sum AS "Total Workload",
e.employee_count AS "Total Employees",
t.task_count AS "Finished Tasks"
from p
JOIN (select pno, sum(workload) as workload_sum
from w
group by pno) w ON (w.pno=p.pnumber)
JOIN (select pno, count(distinct w.essn) as employee_count
from w
group by pno) e ON (e.pno=p.pnumber)
JOIN (select pno, count(distinct t.name) as task_count
from t
group by pno) t ON (t.pno=p.pnumber)
WHERE t.END_DATE is NOT NULL;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)