Sql Oracle是否有其他方法获得答案,如使用联接?

Sql Oracle是否有其他方法获得答案,如使用联接?,sql,oracle,subquery,Sql,Oracle,Subquery,显示销售部门或研究部门员工的员工ID、姓氏、职务ID、经理ID,薪资等级为C 答案是: 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 wh

显示销售部门或研究部门员工的员工ID、姓氏、职务ID、经理ID,薪资等级为C

答案是:

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,我认为薪水的问题不在losal和hisal之间

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
选择emp.empno、emp.ename、emp.job、emp.mgr
来自emp
emp.deptno上的内部联接dept=中的dept.deptno和dept.dname('SALES','RESEARCH'))
emp.sal>上的内部连接salgrade>=salgrade.losal和
皇帝萨尔
“我不认为要求工资的问题在洛萨尔和希萨尔之间。”

该问题说明薪资需要与特定的
等级相匹配

“C级薪金

当然,经典SCOTT/TIGER模式中的等级有一个数值级:

SQL> select * from salgrade;

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

SQL> 
这个问题的草率符合答案的奇怪性质。无论如何,正如我们所看到的,等级是分配给工资级别的。因此,要找到特定等级的员工,我们需要将他们的工资与该等级的上下限相匹配,
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>
我更喜欢将连接条件与筛选器分开。有几种方法可以做到这一点,查询同时演示了这两种方法:

  • 在内联视图中筛选表
  • 在主查询的WHERE子句中筛选表

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

    那么这个“答案”从何而来?哇……让它更容易。谢谢。有多少个“和”“如果你不介意我问的话,可以吗