相同的子查询在同一个表上

时间:2017-10-29 16:36:48

标签: sql sql-server tsql

这是表模式 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
);

结果也是空的..

为什么!!! ????

2 个答案:

答案 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;