2个表EMP和DEPT,EMP表中记录所有职员的信息,DEPT表中记录部门和经理名字,要查询工资大于本部门经理工资的员工姓名和工资,以下是2个查询语句,第一个是ok的,第二个则报警:子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。2个查询语句的区别仅仅是第二个语句没有使用表的别名而已,但问什么就不行了呢?
语句1
SELECt X.姓名, X.工资
FROM EMP AS X
WHERe X.工资 > ( SELECt 工资
FROM EMP
WHERe 职工号 IN
( SELECt 部门经理的职工号
FROM DEPT
WHERe 部门号=X.所在部门 ) )
语句2)
SELECt 姓名, 工资
FROM EMP AS A
WHERe 工资 > ( SELECt 工资
FROM EMP
WHERe 职工号 IN
( SELECt 部门经理的职工号
FROM DEPT
WHERe 部门号=所在部门 ) )
语句2)最后一行漏了表名,应该是:
SELECt 姓名, 工资
FROM EMP
WHERe 工资 > ( SELECt 工资
FROM EMP
WHERe 职工号 IN
( SELECt 部门经理的职工号
FROM DEPT
WHERe 部门号=EMP.所在部门 )
SQL中子查询返回的值多于一个的问题
答案:2 悬赏:20 手机版
解决时间 2021-02-09 05:30
- 提问者网友:几叶到寒
- 2021-02-08 20:23
最佳答案
- 五星知识达人网友:青灯有味
- 2021-02-08 21:04
原因是:第一个查询里的第一个EMP使用了别名X,所以在最后一行的“WHERe 部门号=X.所在部门”,这里的X就把第一个EMP表和DEPT表相关联,所以在“
SELECt 工资
FROM EMP
WHERe 职工号 IN...”这个查询里反回的只有一行数据。
第二个查询,因为没用使用别名,所以,DEPT会和最近的EMP表相关联,其结果就是使得
“SELECt 工资
FROM EMP
WHERe 职工号 IN...”这个查询,反回多行,所以就会报错了。
如果把第二个查询改成这样
SELECt 姓名, 工资
FROM EMP
WHERe 工资 > ( SELECt TOP 1 工资
FROM EMP
WHERe 职工号 IN
( SELECt 部门经理的职工号
FROM DEPT
WHERe 部门号=EMP.所在部门 )就不会报错了,当然结果也是不正确的。
SELECt 工资
FROM EMP
WHERe 职工号 IN...”这个查询里反回的只有一行数据。
第二个查询,因为没用使用别名,所以,DEPT会和最近的EMP表相关联,其结果就是使得
“SELECt 工资
FROM EMP
WHERe 职工号 IN...”这个查询,反回多行,所以就会报错了。
如果把第二个查询改成这样
SELECt 姓名, 工资
FROM EMP
WHERe 工资 > ( SELECt TOP 1 工资
FROM EMP
WHERe 职工号 IN
( SELECt 部门经理的职工号
FROM DEPT
WHERe 部门号=EMP.所在部门 )就不会报错了,当然结果也是不正确的。
全部回答
- 1楼网友:我住北渡口
- 2021-02-08 22:11
我。。知。。道
加。。我。。私。。聊
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯