基于经典经理-雇员在同一张桌子上的问题,解决了一个挑战。给定具有ID,员工和管理人员ID的表
表格:
EMPNO ENAME JOB MGR
---------- ---------- --------- ----------
7839 KING PRESIDENT
7698 BLAKE MANAGER 7839
7782 CLARK MANAGER 7839
7566 JONES MANAGER 7839
7654 MARTIN SALESMAN 7698
7499 ALLEN SALESMAN 7698
7844 TURNER SALESMAN 7698
7900 JAMES CLERK 7698
7521 WARD SALESMAN 7698
7902 FORD ANALYST 7566
7369 SMITH CLERK 7902
7788 SCOTT ANALYST 7566
7876 ADAMS CLERK 7788
7934 MILLER CLERK 7782
我走的很远是使用旧形式的联接(我不想)来查询,该联接在'FROM'之后用逗号分隔:
WITH e AS ( SELECT * FROM employee),
m AS ( SELECT * FROM employee)
SELECT e.ENAME
e.JOB
m.ENAME
m.JOB
FROM e,m //dont want this
WHERE e.MGR = m.EMPNO;
我期望使用不带JOINS的CTE的解决方案,如果可能的话也可以不带UNION的解决方案,也可以得到我的输出:
Employee Emp# Manager Mgr#
BLAKE 7698 KING 7839
CLARK 7782 KING 7839
JONES 7566 KING 7839
MARTIN 7654 BLAKE 7698
ALLEN 7499 BLAKE 7698
TURNER 7844 BLAKE 7698
JAMES 7900 BLAKE 7698
WARD 7521 BLAKE 7698
FORD 7902 JONES 7566
SMITH 7369 FORD 7902
SCOTT 7788 JONES 7566
ADAMS 7876 SCOTT 7788
MILLER 7934 CLARK 7782
使用联接的效率更高,但是如果您不能做到这一点,那么这是另一种方式:
SELECT
e.ENAME,
e.JOB,
(SELECT ENAME FROM employee WHERE MGR = e.EMPNO),
(SELECT JOB FROM employee WHERE MGR = e.EMPNO)
FROM employee e
;
它没有显式连接,但不使用CTE
。不确定是否可以。