问题描述
- Oracle 关于视图查询问题
- CREATE OR REPLACE VIEW V_HZY_SALARY
AS
SELECT D.DEPTNO DNOD.DNAME DN
MAX(E.SAL)MAX_SAL
MIN(E.SAL)MIN_SAL
AVG(E.SAL)AVG_SAL
SUM(E.SAL)SUM_SAL
FROM EMP_HZY E DEPT D WHERE E.DEPTNO=D.DEPTNO GROUP BY D.DEPTNOD.DNAMESELECT E.ENAMEE.SALE.DEPTNO
FROM EMP_HZY E
WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30)
出现单行子查询返回多个行!!新手求高人指导,谢谢。
解决方案
WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30) 下面(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30)这个子句可能是多条,你视图中是根据 D.DEPTNOD.DNAME两个条件分组的,这里select只有一个deptno条件 可以加(SELECT top 1 AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30)
解决方案二:
CREATE OR REPLACE VIEW V_HZY_SALARY
AS
SELECT D.DEPTNO DNOD.DNAME DN
MAX(E.SAL)MAX_SAL
MIN(E.SAL)MIN_SAL
AVG(E.SAL)AVG_SAL
SUM(E.SAL)SUM_SAL
FROM EMP_HZY E DEPT D WHERE E.DEPTNO=D.DEPTNO GROUP BY D.DEPTNOD.DNAME
SELECT E.ENAMEE.SALE.DEPTNO
FROM EMP_HZY E
WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30)
SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30这个执行返回一个值,
WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30) 这里执行是大于这个值的都查询,不是单条语句的查询了
解决方案三:
WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30) 这里执行是大于这个平均值的都查询,不是单条语句的查询了
解决方案四:
WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30) 问题出在这一句,你可以试一下括号里的查询语句,esal/2 是不能>多个数值的,你可能写错了, 应该是WHERE E.SAL/2>(SELECT AVG(列名) from V_HZY_SALARY WHERE DEPTNO=30) 这样就可以了,子查询只会返回一个数值,esal/2>x 是可以的
解决方案五:
oracle授予所有视图的查询权限