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
任何人都可以帮助我吗?我的查询有什么问题? 最后我想创建一个过程,但首先我必须编写查询。
谢谢你们......
答案 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