Есть ли решение для самостоятельной ссылки с CTE без JOIN или UNION? Как и в случае с менеджером-сотрудником - PullRequest
0 голосов
/ 13 октября 2019

Получил задачу, чтобы решить на основе классических менеджеров-сотрудников на одной и той же таблице задач. Имеется таблица с идентификаторами, сотрудников и Manager.

. Таблица:

  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;

Я ожидаю решения, использующего CTE без JOINS и, если возможно, без 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 

Ответы [ 2 ]

1 голос
/ 13 октября 2019

Если вам нужно использовать CTE, вы все равно должны использовать условие UNION ALL. Вы можете попробовать использовать предложение CONNECT BY, как показано ниже -

SELECT e.ename employee, e.EMPNO as Emp#, PRIOR ENAME as Manager, PRIOR EMPNO as Mgr#
FROM employee e
WHERE MGR IS NOT NULL
START WITH MGR IS NULL
CONNECT BY PRIOR EMPNO = MGR
0 голосов
/ 13 октября 2019

Гораздо эффективнее использовать объединение, но если вы не можете этого сделать, то есть другой способ:

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. Не уверен, что это нормально.

Если вы хотите с CTE, вот один из способов:

WITH e AS (SELECT * FROM Employee) 
SELECT 
  emp.ENAME, 
  emp.JOB, 
  (SELECT ENAME FROM e WHERE MGR = emp.EMPNO), 
  (SELECT JOB FROM e WHERE MGR = emp.EMPNO)
FROM employee emp
;

SQL Fiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...