显示销售或研究部门和薪资等级为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);
但是我想知道是否有办法加入这些表并显示答案,因为我的第一个想法是试图将这些表连在一起。
我尝试过这样的事情:
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 的方法,我认为这个问题并不是要求薪水介于失败和治疗之间。
答案 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符合答案的奇异性质。无论如何,正如我们所看到的,成绩被分配到工资带。因此,要找到特定年级的员工,我们需要将他们的薪水与该年级的上限和下限相匹配,losal
和hisal
。
这是一个解决方案:
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>
我更喜欢将连接条件与过滤器分开。有两种方法可以做到这一点,查询演示了两者:
语法允许我们在on
子句中包含非连接条件,但这可能有副作用。最好是在连接和过滤器之间保持清晰,哪种分离是ANSI 92语法的要点。