Oracle:单行子查询返回多行

时间:2014-03-31 10:26:51

标签: sql oracle

SELECT e.name from emp e, departm d, salery s WHERE e.dep=d.depid AND s.emp= e.empid AND s.sal > (SELECT round(avg(s.sal)) as AVGSAL from emp e, departm d, salery s WHERE e.dep=d.depid AND s.emp= e.empid GROUP BY d.depid );

我的表格是: emp (empid, name, dep) departm (depid, name, headdep) salery (emp, cost, sal, fdate)

我有一些外键:
离开:FOREIGN KEY (headdep) REFERENCES departm(depid)
emp:FOREIGN KEY(dep) REFERENCES departm(depid)
销售:FOREIGN KEY(emp) REFERENCES emp(empid)

我想打印一份所有员工的清单,这些员工的收入超过了他们部门的平均水平但是当我运行此查询时出现错误:single-row subquery returns more than one row

任何人都可以帮助我吗?我的查询有什么问题? 最后我想创建一个过程,但首先我必须编写查询。

谢谢你们......

2 个答案:

答案 0 :(得分:2)

分析函数是继续此查询的方法,但您的版本有几个问题。如果使用正确的连接语法,您会更容易看到这些问题。您似乎在学习SQL,所以请记住一条简单的规则:永远不要在from子句中使用逗号。

除语法问题外,您的相关子查询存在问题。这是一个应该有效的版本:

SELECT e.vollername
from emp e join
     salery s
     on s.emp= e.empid
WHERE s.sal > (select round(avg(s2.sal)) as AVGSAL
               from emp e2 join
                    salery s2
                    on s2.emp= e2.empid 
               where e2.dep = e.depid
              );

请注意从内部和外部查询中删除departm表。在外层,它只是多余的。在内部,它阻止了查询产生正确的结果,因为它删除了相关性。

答案 1 :(得分:1)

使用分析函数这有点容易(我也删除了departm的连接,因为它不需要):

SELECT e.vollername
FROM (
  SELECT 
    e.vollername, 
    s.sal,
    round(avg(s.sal) over (partition by e.dep)) as avg_dep_sal
  FROM 
    emp e
  JOIN salery s ON e.empid = s.emp
)
where sal > avg_dep_sal