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

SQL:连接表后,SUM()函数返回错误的值,sql,oracle,join,oracle11g,inner-join,Sql,Oracle,Join,Oracle11g,Inner Join,我目前正在从事一个数据库项目,在连接表方面遇到一些问题。最初的情况是: 四个表格: 任务t~50000条记录 项目p~1000记录 关于w~30000记录的工作 员工e~10000记录 表w有一个名为类似WORKLOAD的属性,不幸的是,SUMw.WORKLOAD的结果不是预期的结果: SELECT p.NAME, SUM(w.WORKLOAD) AS "Total Workload", COUNT(DISTINCT w.ESSN) AS "Total Employees", COUNT(DIS

我目前正在从事一个数据库项目,在连接表方面遇到一些问题。最初的情况是:

四个表格:

任务t~50000条记录 项目p~1000记录 关于w~30000记录的工作 员工e~10000记录 表w有一个名为类似WORKLOAD的属性,不幸的是,SUMw.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值进行多次计数

那么,有没有像内部联接这样的联接操作可以在不使用子查询的情况下解决问题呢?
提前感谢:-

讨论的是笛卡尔积,其中一个表中的行与其他表中的行相乘。以下方法所做的假设是,每个项目都有一个分配了所有员工的工作负载,因为您的查询没有显示到employee表和任务的联接。如果不是这种情况,那么考虑外部连接和内部连接。< /P> 其思想是根据项目编号在其自己的派生表中执行每个聚合。然后,我们可以按项目编号联接每个派生表,以获得有意义的结果

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;

每个表的表结构是什么?解决方案是在联接之前进行聚合。在您的案例中,您是如何做到这一点的还不清楚。如果您显示p.Name的结果,为什么会使用p.Number分组?表p:pk=p.pnumber;表w:pk=e.ssn,p.pnumber;表t:pk=t.no,p.p编号;为什么w表有两个连接?您可以将w和e子查询合并为一个查询,如下所示:选择pno、sumworkload\u sum、countdistinct essn employee\u count from w group by pnoit是一个占位符-按原样,员工可能不会被计数。问题涉及到一个employees表-这将是一个合适的表。