Oracle有另一种方法可以获得像使用JOIN的答案吗?

时间:2017-04-13 23:25:40

标签: sql oracle subquery

显示销售或研究部门和薪资等级为C的员工的员工ID,LAST NAME,JOB_ID,经理ID。

答案是:

select empno, ename, job, mgr
 from emp
where deptno IN (select deptno
              from dept
              where dname IN ('SALES', 'RESEARCH'))
and sal between(select losal from salgrade
              where grade=3)
and (select hisal
    from salgrade where
      grade=3);
  • 表EMP包含EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO列。
  • 表SALGRADE列有Grade,LoSal,HiSal。
  • 表DEPT具有DEPTNO,DNAME,LOC列。

但是我想知道是否有办法加入这些表并显示答案,因为我的第一个想法是试图将这些表连在一起。

我尝试过这样的事情:

select e.empno,e.ename,e.job,e.mgr
from emp e
join dept d on e.deptno = d.deptno
join salgrade s on e.sal between (
  select losal
  from salgrade
  where grade =3) 
and (
  select hisal
  from salgrade
  where grade=3)

但无法找到包含 DNAME 的方法,我认为这个问题并不是要求薪水介于失败和治疗之间

2 个答案:

答案 0 :(得分:0)

试试这个:

select emp.empno, emp.ename, emp.job, emp.mgr
from emp 
inner join dept on emp.deptno = dept.deptno and dept.dname IN ('SALES', 'RESEARCH')
inner join salgrade on emp.sal >= salgrade.losal and
    emp.sal <= salgrade.hisal and salgrade.grade = 3

您可以inner join多个条件,请参阅我将and dept.dname IN ('SALES','RESEARCH')添加到inner join条件。

答案 1 :(得分:0)

  

&#34;我不认为这个问题要求工资介于失败和治疗之间。&#34;

问题表明工资需要与特定grade匹配。

  

&#34;工资等级为C.

当然,经典的SCOTT / TIGER架构中的SALGRADE有一个数字grade

SQL> select * from salgrade;

     GRADE      LOSAL      HISAL
---------- ---------- ----------
         1        700       1200
         2       1201       1400
         3       1401       2000
         4       2001       3000
         5       3001       9999

SQL> 

问题的邋iness符合答案的奇异性质。无论如何,正如我们所看到的,成绩被分配到工资带。因此,要找到特定年级的员工,我们需要将他们的薪水与该年级的上限和下限相匹配,losalhisal

这是一个解决方案:

SQL> select empno, ename, job, mgr
  2  from emp
  3       join dept
  4          on emp.deptno = dept.deptno
  5       join ( select * from salgrade
  6             where grade = 3 ) sg3
  7                     on emp.sal between sg3.losal and sg3.hisal
  8  where dept.dname IN ('SALES', 'RESEARCH')
  9  /

     EMPNO ENAME      JOB              MGR
---------- ---------- --------- ----------
      7499 ALLEN      SALESMAN        7698
      7844 TURNER     SALESMAN        7698

SQL>

我更喜欢将连接条件与过滤器分开。有两种方法可以做到这一点,查询演示了两者:

  1. 以内嵌视图过滤表格
  2. 在主查询的WHERE子句
  3. 中过滤表格

    语法允许我们在on子句中包含非连接条件,但这可能有副作用。最好是在连接和过滤器之间保持清晰,哪种分离是ANSI 92语法的要点。