【问题标题】:Newbie question: Problem with results, sql, join, where, "<" operator新手问题:结果问题、sql、join、where、“<”运算符
【发布时间】:2019-02-08 17:42:53
【问题描述】:

任务:

显示员工的姓氏、员工的薪水及其经理 姓氏和薪水。我们只对那些 在他们的经理之前被雇用并且薪水低于平均水平 他们的部门。

代码:

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 (Grant)
  • 在单人部门 (Whalen) 工作的一名员工。

但是,当我将e.salary &lt; (select avg(e.salary)... 之间的&lt; 运算符更改为相反的&gt; 时(假设这次我们对那些薪水高于部门平均水平的人感兴趣),结果是正确的。

我不明白为什么它会以这种方式工作?我试图通过添加这一行来解决这个问题

 and e.salary<>(select avg(e.salary) 
               from employees e 
               where e.department_id=e.department_id)`

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

这是我的桌子:

【问题讨论】:

  • 来自新用户的一个好问题,您可以在其中显示问题、代码和一些数据。下次如果可以avoid screenshots 那就完美了。为我 +1。

标签: sql oracle subquery where


【解决方案1】:

这是一个微妙的问题。在您的子查询中,您使用了别名 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
;

【讨论】:

  • 是的,这解决了问题。非常感谢您的帮助和编辑。
  • @APC 。 . .它并没有完全崩溃到1=1。它相当于e.department_id is not null。在这种情况下没有什么不同,但在其他情况下可能会有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-25
相关资源
最近更新 更多