这是表模式
emp(no, name, salary)
并插入这样的数据。
insert into emp values (1, 'gandalf', 3000);
insert into emp values (2, 'dobby', 4000);
insert into emp values (3, 'legolas', 5000);
我选择数据,就像这样。
select no, name, salary
from emp e
where salary > (
select AVG(salary)
from emp
where no=e.no
);
但结果是空的! 我不明白......
我预料到了这一点(3, 'legolas', 5000)
我尝试这个查询,它有效。
select no, name, salary
from emp
where salary > (
select AVG(salary)
from emp d
where no=d.no
);
那么,相关子查询必须在同一个表上使用别名变量吗?
同时,superquery必须没有别名变量?
我也不明白这一点。
select no, name, salary
from emp s
where salary > (
select AVG(salary)
from emp d
where s.no=d.no
);
结果也是空的..
为什么!!! ????
答案 0 :(得分:2)
不要使用相关性。在您的示例中,您基本上将员工薪水与平均薪水(同一人where s.no=d.no
)进行比较。
例如,对于员工编号= 1,您得到了:
WHERE 3000 > (3000) -- false no record returned
您可能希望选择薪水高于所有员工平均水平的员工。在这种情况下使用:
select no, name, salary
from emp
where salary > (
select AVG(salary)
from emp d
);
修改强>
何时使用相关性(添加deparment_id
列)的场景:
SELECT no, name, salary, deparment_id
FROM emp e1
WHERE salary >= (SELECT AVG(salary)
FROM emp e2
WHERE e1.department_id = e2.department_id);
答案 1 :(得分:1)
假设emp.no
唯一标识每一行,则相关子查询中的平均值该雇员的工资。员工的工资永远不会超过他/她的工资。大概你打算:
select no, name, salary
from emp e
where salary > (select AVG(e2.salary)from emp e2);
你也可以使用窗口函数来编写它:
select no, name, salary
from (select e.*, avg(salary) over () as avg_salary
from emp e
) e
where salary > avg_salary;