2013-04-12 44 views
0

为什么没有在甲骨文这个选择的工作,尽管在PostgreSQL的工作(第三总和应该是在同一个这样的:从员工选择SUM(工资)):2表副本从

select e1.employee_id, e1.department_id, e1.manager_id, e1.salary, 
sum(e2.salary), sum(e3.salary) 
from employees e1, employees e2, employees e3 
where e1.department_id=e2.department_id 
group by e1.employee_id, e1.department_id, e1.manager_id, e1.salary 
order by 1,2; 

它的工作原理在PostgreSQL中,但不在这里。在Oracle工作只有一个副本E2没有任何约束条件(当e1为原始表,并通过它的主键分组)之后,从:

select e1.employee_id, e1.department_id, e1.manager_id, e1.salary, 
    sum(e2.salary) 
    from employees e1, employees e2 
    where e1.department_id=e2.department_id 
    group by e1.employee_id, e1.department_id, e1.manager_id, e1.salary 
    order by 1,2; 

或甚至没有,其中作为第一表的每个记录中的整个总和(这里没有任何限制):

select e1.employee_id, e1.department_id, e1.manager_id, e1.salary, 
    sum(e2.salary) 
    from employees e1, employees e2 
    group by e1.employee_id, e1.department_id, e1.manager_id, e1.salary 
    order by 1,2; 

当然,我知道其他替代选择,例如:

select employee_id, department_id, manager_id, salary, 
sum(salary) over (partition by department_id) as suma, 
sum(salary) over() 
from employees order by 2,3; 

或与子查询:

select employee_id, department_id, manager_id, salary, 
(select sum(e2.salary) from employees e2 
where e2.department_id=e1.department_id) as suma1, 
(select sum(e2.salary) from employees e2) as suma2 
from employees e1 order by 1,2; 

您是否知道在Oracle中执行多个表副本的方法?

+0

*您需要*解释查询开始的目的。用简单的英语。什么是'sum(e2.salary)'和'sum(e3.salary)'应该达到? –

+0

这是一个学术的例子,他们只是在那里,有些条件可以是不同的总和,但第三选择他们只是所有工资的总和。 – 42n4

回答

1

在第一个查询您创建一个完整的笛卡尔乘积,因为你没有设置任何约束表之间的匹配

+0

这些是员工的副本,一个表由“主键”组成,其他副本应连接到第一个表的一个记录或整个第一个表的记录,或者在哪里被条件切断。它适用于PostgreSQL。 – 42n4

+0

在您最后一次编辑之后仍然没有e3和其他表格之间的“链接” –

+0

没有费用的一个副本在编辑我的问题时起作用。在PostgreSQL中它可以处理两个甚至更多的副本。 – 42n4