是否有没有使用JOIN或UNION的CTE自引用的解决方案?就像关于经理-雇员问题

问题描述 投票:0回答:1

基于经典经理-雇员在同一张桌子上的问题,解决了一个挑战。给定具有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 
sql oracle
1个回答
0
投票

使用联接的效率更高,但是如果您不能做到这一点,那么这是另一种方式:

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。不确定是否可以。

SQL Fiddle

© www.soinside.com 2019 - 2024. All rights reserved.