我怎样才能找到收入比他们的经理少的员工? - ORACLE - 斯科特数据库
How can I get employess who earn less money than their managers? - ORACLE - SCOTT database
我正在尝试获取收入低于其经理的雇员的姓名。三个部门都有经理。括号 returns 中的子查询 salary of this managers 正确。我也尝试接收所有没有经理的工人,但我的代码总是错误的。你知道我应该纠正什么吗?
SELECT sal
FROM SCOTT.emp
WHERE NOT EXISTS (SELECT sal
FROM SCOTT.emp
WHERE job LIKE 'MANAGER');
这是我的 table:
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
COMM
DEPTNO
7369
SMITH
CLERK
7902
80/12/17
800
20
7499
ALLEN
SALESMAN
7698
81/02/20
1600
300
30
7521
WARD
SALESMAN
7698
81/02/22
1250
500
30
7566
JONES
MANAGER
7839
81/04/02
2975
20
7654
MARTIN
SALESMAN
7698
81/09/28
1250
1400
30
7698
BLAKE
MANAGER
7839
81/05/01
2850
30
7782
CLARK
MANAGER
7839
81/06/09
2450
10
7839
KING
PRESIDENT
81/11/17
5000
10
7844
TURNER
SALESMAN
7698
81/09/08
1500
0
30
7900
JAMES
CLERK
7698
81/12/03
950
30
7902
FORD
ANALYST
7566
81/12/03
3000
20
7934
MILLER
CLERK
7782
82/01/23
1300
10
看来自己加入我了。
SQL> select e.ename employee, e.sal sal_employee,
2 m.ename manager , m.sal sal_manager
3 from emp e join emp m on e.mgr = m.empno
4 where e.sal < m.sal;
EMPLOYEE SAL_EMPLOYEE MANAGER SAL_MANAGER
---------- ------------ ---------- -----------
JAMES 950 BLAKE 2850
TURNER 1500 BLAKE 2850
MARTIN 1250 BLAKE 2850
WARD 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
MILLER 1300 CLARK 2450
ADAMS 1100 SCOTT 3000
CLARK 2450 KING 5000
BLAKE 2850 KING 5000
JONES 2975 KING 5000
SMITH 800 FORD 3000
11 rows selected.
SQL>
您可以使用分层查询:
SELECT ename,
PRIOR ename AS mgr_ename,
sal,
PRIOR sal AS mgr_sal
FROM emp
WHERE (LEVEL = 2 AND sal < PRIOR sal) -- salary is less than manager's salary
OR (LEVEL = 1 AND mgr IS NULL) -- has no manager
CONNECT BY PRIOR empno = mgr
输出:
ENAME
MGR_ENAME
SAL
MGR_SAL
ADAMS
SCOTT
1100
3000
SMITH
FORD
800
3000
MILLER
CLARK
1300
2450
ALLEN
BLAKE
1600
2850
JAMES
BLAKE
950
2850
TURNER
BLAKE
1500
2850
MARTIN
BLAKE
1250
2850
WARD
BLAKE
1250
2850
KING
5000
JONES
KING
2975
5000
CLARK
KING
2450
5000
BLAKE
KING
2850
5000
db<>fiddle here
我正在尝试获取收入低于其经理的雇员的姓名。三个部门都有经理。括号 returns 中的子查询 salary of this managers 正确。我也尝试接收所有没有经理的工人,但我的代码总是错误的。你知道我应该纠正什么吗?
SELECT sal
FROM SCOTT.emp
WHERE NOT EXISTS (SELECT sal
FROM SCOTT.emp
WHERE job LIKE 'MANAGER');
这是我的 table:
EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
---|---|---|---|---|---|---|---|
7369 | SMITH | CLERK | 7902 | 80/12/17 | 800 | 20 | |
7499 | ALLEN | SALESMAN | 7698 | 81/02/20 | 1600 | 300 | 30 |
7521 | WARD | SALESMAN | 7698 | 81/02/22 | 1250 | 500 | 30 |
7566 | JONES | MANAGER | 7839 | 81/04/02 | 2975 | 20 | |
7654 | MARTIN | SALESMAN | 7698 | 81/09/28 | 1250 | 1400 | 30 |
7698 | BLAKE | MANAGER | 7839 | 81/05/01 | 2850 | 30 | |
7782 | CLARK | MANAGER | 7839 | 81/06/09 | 2450 | 10 | |
7839 | KING | PRESIDENT | 81/11/17 | 5000 | 10 | ||
7844 | TURNER | SALESMAN | 7698 | 81/09/08 | 1500 | 0 | 30 |
7900 | JAMES | CLERK | 7698 | 81/12/03 | 950 | 30 | |
7902 | FORD | ANALYST | 7566 | 81/12/03 | 3000 | 20 | |
7934 | MILLER | CLERK | 7782 | 82/01/23 | 1300 | 10 |
看来自己加入我了。
SQL> select e.ename employee, e.sal sal_employee,
2 m.ename manager , m.sal sal_manager
3 from emp e join emp m on e.mgr = m.empno
4 where e.sal < m.sal;
EMPLOYEE SAL_EMPLOYEE MANAGER SAL_MANAGER
---------- ------------ ---------- -----------
JAMES 950 BLAKE 2850
TURNER 1500 BLAKE 2850
MARTIN 1250 BLAKE 2850
WARD 1250 BLAKE 2850
ALLEN 1600 BLAKE 2850
MILLER 1300 CLARK 2450
ADAMS 1100 SCOTT 3000
CLARK 2450 KING 5000
BLAKE 2850 KING 5000
JONES 2975 KING 5000
SMITH 800 FORD 3000
11 rows selected.
SQL>
您可以使用分层查询:
SELECT ename,
PRIOR ename AS mgr_ename,
sal,
PRIOR sal AS mgr_sal
FROM emp
WHERE (LEVEL = 2 AND sal < PRIOR sal) -- salary is less than manager's salary
OR (LEVEL = 1 AND mgr IS NULL) -- has no manager
CONNECT BY PRIOR empno = mgr
输出:
ENAME MGR_ENAME SAL MGR_SAL ADAMS SCOTT 1100 3000 SMITH FORD 800 3000 MILLER CLARK 1300 2450 ALLEN BLAKE 1600 2850 JAMES BLAKE 950 2850 TURNER BLAKE 1500 2850 MARTIN BLAKE 1250 2850 WARD BLAKE 1250 2850 KING 5000 JONES KING 2975 5000 CLARK KING 2450 5000 BLAKE KING 2850 5000
db<>fiddle here