SQL查询时错误:子查询返回的值多于一个
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL查询时错误:子查询返回的值多于一个相关的知识,希望对你有一定的参考价值。
where
(len(w011)='15' and Substring(w011,15,1)%2<>w002%2 or
len(w011)='18' and Substring(w011,17,1)%2<>w002%2)
在使用以上语句查询时出错了
服务器: 消息 512,级别 16,状态 1,行 15
子查询返回的值多于一个。当子查询跟随在 =、!=、<、<=、>、>= 之后,或子查询用作表达式时,这种情况是不允许的。
请问各位大侠应该如果改?
where (((len(身份证号)=15) and (Substring(身份证号,15,1) in (1,3,5,7,9)) and 性别<>'男')
or ((len(身份证号)=15) and (Substring(身份证号,15,1) in (2,4,6,8,0)) and 性别<>'女'))
or (((len(身份证号)=18) and (Substring(身份证号,17,1) in (1,3,5,7,9)) and 性别<>'男')
or ((len(身份证号)=18) and (Substring(身份证号,17,1) in (2,4,6,8,0)) and 性别<>'女'))
在使用这种查询语句的时候也出了同样的错,请教各位老师应如何改?
当主表的该列得出一条的时候,子查询条件下却得到多条。就会100%报这个错误。
你将Sql全部贴出。或者Select部分的列取得 参考技术B 很明显你WHERE条件里并没有子(嵌套)查询啊?你这括号括的…
你试试:
where (len(w011)='15' and Substring(w011,15,1)%2<>w002%2) or (len(w011)='18' and Substring(w011,17,1)%2<>w002%2)追问
还是一样的提示那错误
参考技术C 天,都不知道你前面是什么,你要做什么,谁能改啊!你前面是个update的语句吧,后面返回的结果不止一个是更新不了的 参考技术D 问题不清楚单行子查询返回多于一行
【中文标题】单行子查询返回多于一行【英文标题】:Single-row subquery returns more than one row 【发布时间】:2011-09-11 22:31:17 【问题描述】:我需要一些有关 oracle sql 的帮助。问题:我有 2 张表员工和部门。我从一个查询中得到了部门的平均工资,我想用它来看看有多少员工比他们部门的平均工资多。到目前为止我有这个。
此查询返回部门的平均值:
select ROUND(AVG(Salary), 2) Dept_avg_sal
from employee, department
where department.department_id = employee.department_id
group by department_name
我想做的是:
select employee_name,
salary,
d.department_name
from employee e,
department d
where salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal
from employee,
department
where department.department_id = employee.department_id
group by department_name)
我得到的错误是:01427。 00000 - “”
我知道同一部门的 2 名员工的收入高于平均水平,我认为这就是造成问题的原因。
EMPLOYEE_NAME - SALARY - -DEPARTMENT_NAME- DEPT_AVG_SAL
-------------------- ---------------------- -------------------- ------------
FISHER - 3000.00 - SALES - 2500.00
JONES - 3000.00 - ACCOUNTING - 2750.00
KING - 5000.00 - EXECUTIVE - 4500.00
**SCOTT - 2500.00 - IT - 2100.00
SMITH - 2900.00 - IT - 2100.00**
WILSON - 3000.00 - RESEARCH - 2633.33
任何帮助将不胜感激。
【问题讨论】:
你为什么要标记这个MySQL
你需要一个适用于 Oracle 和 MySQL 的答案吗?
【参考方案1】:
您的初始查询缺少外部查询中的任何连接条件以及内部查询中的任何相关条件,这会将其限制为感兴趣部门的行。通常你也不想group by name
因为大概id
是主键。
解决这些问题以修复您的相关子查询给出了
SELECT e.employee_name,
e.salary,
d.department_name
FROM employee e
JOIN department d
ON d.department_id = e.department_id
WHERE e.salary > (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal
FROM employee e2
WHERE e2.department_id = e.department_id)
但您可能会发现放弃标量相关子查询并用派生表替换效果更好。
SELECT e.employee_name,
e.salary,
d.department_name
FROM employee e
JOIN department d
ON d.department_id = e.department_id
JOIN (SELECT ROUND(AVG(Salary), 2) Dept_avg_sal,
department_id
FROM employee
GROUP BY department_id) e2
ON e2.department_id = e.department_id
AND e.salary > e2.Dept_avg_sal
我相信以下对于 Oracle 也应该有效
SELECT employee_name,
salary,
d.department_name
FROM (SELECT employee_name,
salary,
d.department_name,
AVG(Salary) OVER (PARTITION BY e.department_id) AS AvgSalary
FROM employee e
JOIN department d
ON d.department_id = e.department_id)
WHERE salary > AvgSalary
【讨论】:
【参考方案2】:> 运算符只接受一个值,因此您的内部 SELECT 必须准确返回 1 行。我的猜测是你得到多行。查看您的内部 SELECT 返回的内容并尝试 LIMIT 1。
【讨论】:
【参考方案3】:我认为您应该在子查询中添加一个额外的d.department_id = department.department_id
条件(未测试):
select employee_name,
salary,
d.department_name
from employee e,
department d
where salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal
from employee,
department
where department.department_id = employee.department_id
AND d.department_id = department.department_id
group by department_name)
或者直接写:
select e.employee_name,
e.salary,
d.department_name
from employee e,
department d
where e.department_id = d.department_id
AND salary > (select ROUND(AVG(Salary), 2) Dept_avg_sal
from employee
where e.department_id = employee.department_id)
【讨论】:
以上是关于SQL查询时错误:子查询返回的值多于一个的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL:ORA-01427:单行子查询返回多于一行
得到以下错误 ORA-01427: 单行子查询返回多于一行 01427. 00000 - “单行子查询返回多于一行”
服务器: 消息 512,级别 16,状态 1,行 1 子查询返回的值多于一个。