SQL:连接表后SUM()函数返回错误的值

时间:2017-03-09 20:30:20

标签: sql oracle join oracle11g inner-join



我目前正在开发一个数据库项目,并且在连接表时遇到了一些问题。最初的情况是:

四个表:

  • 任务t~50000记录
  • 项目p~1000条记录
  • workon 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值。

那么有没有像内连接这样的连接操作可以在不使用子查询的情况下修复问题?

在此先感谢: - )

1 个答案:

答案 0 :(得分:1)

问题是笛卡尔积(其中一个表中的行乘以其他表中的行)。以下方法的假设是每个项目都有一个工作负载,其中分配了员工(所有员工都考虑了所有员工,因为您的查询未显示对员工表的连接)和任务。如果不是这种情况,那么考虑使用外连接与内连接。

这个想法是根据项目编号在自己的派生表中执行每个聚合。然后,我们可以按项目编号连接每个派生表,以获得有意义的结果。

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;