【问题标题】:Oracle: single-row subquery returns more than one rowOracle:单行子查询返回多行
【发布时间】:2014-03-31 19:22:18
【问题描述】:

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)
员工:FOREIGN KEY(dep) REFERENCES departm(depid)
销售:FOREIGN KEY(emp) REFERENCES emp(empid)

我想打印一份收入高于部门平均水平的所有员工的列表,但是当我运行此查询时出现错误:single-row subquery returns more than one row

谁能帮助我?我的查询有什么问题? 最后我想创建一个过程,但首先我必须编写查询。

谢谢你们……

【问题讨论】:

  • 什么是 m.abt 列.. 没有表别名 m.. 更正它

标签: sql oracle


【解决方案1】:

分析函数是进行此查询的方法,但您的版本有几个问题。如果您使用正确的连接语法,您会更容易看到这些问题。您似乎正在学习 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 表。在外面,它只是多余的。在内部,它阻止了查询产生正确的结果,因为它删除了相关性。

【讨论】:

  • 谢谢你,我现在必须用 The Procedere 测试它,但它对你有用 :)
【解决方案2】:

使用分析函数会更容易一些(我还删除了与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

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 2020-12-20
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-01
    • 2013-05-25
    相关资源
    最近更新 更多