gpt4 book ai didi

sql - 新手问题 : Problem with results, sql, join, where, "<"操作符

转载 作者:行者123 更新时间:2023-12-04 18:01:00 26 4
gpt4 key购买 nike

任务:

Show the last names of employees, employees salary, and their managers last names and salary. We are only interested in those employees who were hired before their managers and have salary below the average of their departments.



代码:
select e.last_name, e.salary, e.hire_date, e.department_id,
m.last_name, m.salary, m.hire_date
from employees e
join employees m on (e.manager_id=m.employee_id)
where e.salary <(select avg(e.salary)
from employees e
where e.department_id=e.department_id)
and e.hire_date < m.hire_date

问题:

我对结果有问题。其中我得到
  • 一名员工与
    工资等于部门平均水平 (Rajs)
  • 一名没有 Department_id 的员工(授予)
  • 一名在单人部门(Whalen)工作的员工。

  • 然而,当我改变 < e.salary < (select avg(e.salary)...之间的运算符到对面 > (假设这次我们对那些工资高于部门平均水平的人感兴趣),结果是正确的。

    我不明白为什么它会以这种方式工作?我试图通过添加这一行来解决这个问题
     and e.salary<>(select avg(e.salary) 
    from employees e
    where e.department_id=e.department_id)`

    但它不起作用。任何人都可以帮助我了解正在发生的事情或只是指明方向吗?

    这是我的表:
    enter image description here

    最佳答案

    这是一个微妙的问题。在您的子查询中,您使用了别名 employees e这与您在主查询中使用的别名相同。这意味着子查询中的过滤器 e.department_id=e.department_id实际上并没有像你想象的那样做:由于命名空间范围,它实际上折叠为 1=1 .因此,由于子查询不相关,因此您不会得到预期的结果。

    解决方案很简单:在子查询中使用不同的别名,如下所示:

    select e.last_name, e.salary, e.hire_date, e.department_id,
    m.last_name, m.salary, m.hire_date
    from employees e
    join employees m on (e.manager_id=m.employee_id)
    where e.salary <(select avg(e2.salary)
    from employees e2
    where e.department_id=e2.department_id)
    and e.hire_date < m.hire_date
    ;

    关于sql - 新手问题 : Problem with results, sql, join, where, "<"操作符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52153601/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com