powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос
25 сообщений из 38, страница 1 из 2
Иерархический запрос
    #35892331
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нужно в таблице Scott-Tiger найти для любой пары сотрудников вывести их ближайшего общего начальника!!! кто знает как? 2 рекурсии как-то сделать?
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892375
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разверни таблицу в вид сотрудник - начальник - дистанция, стартуя от двух сотрудников. Не забудь положить каждого сотрудника как "сам себе начальник, дистанция 0". Положи в with и сджойни саму с собой по условию начальник = начальник, сотрудник <> сотрудник. Выбери минимальную по сумме дистанций.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892390
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а код можно? как стартовать с 2-х id? так можно?
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892392
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
очень надо! помогите :) горят трубы!
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892465
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005очень надо! помогите :) горят трубы!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
COLUMN PATH1 FORMAT A30
COLUMN PATH2 FORMAT A30
SELECT  min(ename) keep (dense_rank first order by lvl) boss_ename,
        min(empno) keep (dense_rank first order by lvl) boss_empno,
        max(path) keep (dense_rank first order by lvl) path1,
        min(path) keep (dense_rank first order by lvl) path2
  FROM  (
         SELECT  ename,
                 empno,
                 path,
                 count(*) over(partition by empno) cnt,
                 min(lvl) over(partition by empno) lvl
           FROM  (
                  SELECT  ename,
                          empno,
                          ltrim(sys_connect_by_path(ename,'-->'),'->') path,
                          level lvl
                    FROM  emp
                    START WITH empno IN ( 7876 , 7902 )
                    CONNECT BY empno = PRIOR mgr
                 )
        )
  WHERE cnt =  2 
/


BOSS_ENAME BOSS_EMPNO PATH1                          PATH2
---------- ---------- ------------------------------ ------------------------------
JONES             7566  FORD-->JONES                   ADAMS-->SCOTT-->JONES

SQL>  

SY.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892501
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
SELECT MAX(MAX(EMPNO)) KEEP(DENSE_RANK FIRST ORDER BY MIN(LEVEL)) "Шеф" 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno
HAVING COUNT(*) =  2 
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892578
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот как Softwarer писал реализовать бы. Мне нужно для каждой пары сотрудников вывести их минимального общего начальника. То есть взять все пары и для них найти начальника.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892591
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005Мне нужно для каждой пары сотрудников вывести их минимального общего начальника. То есть взять все пары и для них найти начальника.
Код: plaintext
select e1.empno, e2.empno, (<select_by_andreymx>) as "Шеф" from emp e1, emp e2;
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892598
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx
Код: plaintext
1.
2.
3.
4.
5.
SELECT MAX(MAX(EMPNO)) KEEP(DENSE_RANK FIRST ORDER BY MIN(LEVEL)) "Шеф" 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno
HAVING COUNT(*) =  2 
max(max(empno))
keep dense_mark first... и IN (:p1, :p2) Это что означает?
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892623
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005 и IN (:p1, :p2) Это что означает?Да-мс... Оказалось - бисер ...
...
Рейтинг: 0 / 0
Иерархический запрос
    #35892966
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А все же, напишите пожалуйста, если не тяжело, что значит max(max(empno)) почему 2 раза max. Keep dense_mark, in(:p1,:p2) что значит? Понимаю что для многих это очень просто. Напишите пожалуйста
...
Рейтинг: 0 / 0
Иерархический запрос
    #35893260
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обьясните просто как работает запрос написанный elic+andreymx!
...
Рейтинг: 0 / 0
Иерархический запрос
    #35893844
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005,

извини, но конструкция in (...) - это основы. Самое начало.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35893929
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
In уже понятно. Непонятно как в целом это работает. Опишите коротко. Тут же пару предложений
...
Рейтинг: 0 / 0
Иерархический запрос
    #35894906
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005In уже понятно. Непонятно как в целом это работает. Опишите коротко. Тут же пару предложений

В целом, оно парсится, выполняется и фетчится. Что конкретно не понятно: иерархия, групировка, FIRST/LAST?

PS: Чтоб не было иллюзий .
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895002
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Непонятно назначение Keep, 2 раза max и dense_mark. Объясните пожалуйста для чего они здесь.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895047
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполните по очереди эти три запроса:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT EMPNO, LEVEL 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 


SELECT MAX(EMPNO), MIN(LEVEL), COUNT(*) 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno 

SELECT MAX(EMPNO), MIN(LEVEL)
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno 
HAVING COUNT(*) =  2 
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895067
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А Keep, dense_mark first для чего нужно? Max(max()) почему? Это описка?
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895088
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005,

а зачем поиск на форуме, гугл и документация? Запрос использует всё то, что Вам непонятно, чтобы решить задачу, с которой Вы не справились. Освойте хотя бы поиск...
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895090
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я не дурак. Просто я сижу сейчас с телефона и не могу найти нормальную информацию по операторам. Мне сдавать в субботу, а дома я буду завтра под поздний вечер. Мне негде смотреть. Я в наряде сижу. Так бы я сам разобрался и вас не мучал.Вы же код уже написали, за что я очень благодарен
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895234
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Integer005[quot andreymx]
Код: plaintext
1.
2.
SELECT MAX(MAX(EMPNO)) KEEP(DENSE_RANK FIRST ORDER BY MIN(LEVEL)) "Шеф" 


что означает эта строчка?
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895240
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
SELECT MAX(EMPNO), MIN(LEVEL)
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno 
HAVING COUNT(*) =  2 
Row#MAX(EMPNO)MIN(LEVEL)178393275662Нам из этого набора нужно выбрать MAX(EMPNO) в той строке, в которой самое маленькое значение MIN(LEVEL).

Это и делает конструкция
SELECT MAX(MAX(EMPNO)) KEEP(DENSE_RANK FIRST ORDER BY MIN(LEVEL)) "Шеф"

Кстати, она безболезненно меняется на
SELECT MIN(MIN(EMPNO)) KEEP(DENSE_RANK FIRST ORDER BY MIN(LEVEL)) "Шеф".
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895267
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Having count(*)=2 это чтобы брать строки до тех пока не найдется общий потомок?
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895275
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005,

нет. Это чтобы оставить результаты группировки, для которых cnt(*) = 2.

PS: А может ну его, тот Оракл? Вон, в наряде сидите, до документации не достучаться...
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895280
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Думаю сарказм неуместен. Будь я дома за компом, я после первого же совета, сел за комп и за изучение и сделал бы. А то что я не уделял должное внимание предмету моя вина и преподавателя ввиду непоследовательности обучения. Если я не силен в базах, то это далеко не значит вы умнее. У всех свои преимущества. А тяга к знаниям наоборот красит. Просто сейчас такая ситуация, что нет никакой документаци
...
Рейтинг: 0 / 0
25 сообщений из 38, страница 1 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]