2 hansmall hansmall 于 2015.07.15 12:23 提问

Oracle 关于视图查询问题

CREATE OR REPLACE VIEW V_HZY_SALARY
AS
SELECT D.DEPTNO DNO,D.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.DEPTNO,D.DNAME

SELECT E.ENAME,E.SAL,E.DEPTNO
FROM EMP_HZY E
WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30)
出现单行子查询返回多个行!!新手求高人指导,谢谢。

5个回答

danielinbiti
danielinbiti   Ds   Rxr 2015.07.15 12:33
 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.DEPTNO,D.DNAME两个条件分组的,这里select只有一个deptno条件
 可以加(SELECT top 1 AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30)
strutce
strutce   Ds   Rxr 2015.07.15 14:24

CREATE OR REPLACE VIEW V_HZY_SALARY
AS
SELECT D.DEPTNO DNO,D.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.DEPTNO,D.DNAME

SELECT E.ENAME,E.SAL,E.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) 这里执行是大于这个值的都查询,不是单条语句的查询了

strutce
strutce   Ds   Rxr 2015.07.15 14:25

WHERE E.SAL/2>(SELECT AVG_SAL FROM V_HZY_SALARY WHERE DEPTNO=30) 这里执行是大于这个平均值的都查询,不是单条语句的查询了

zh_younger
zh_younger   2015.07.15 14:52

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 是可以的

CSDNXIAOD
CSDNXIAOD   2015.07.16 15:30

oracle授予所有视图的查询权限
----------------------biu~biu~biu~~~在下问答机器人小D,这是我依靠自己的聪明才智给出的答案,如果不正确,你来咬我啊!

Csdn user default icon
上传中...
上传图片
插入图片