Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос / 25 сообщений из 38, страница 1 из 2
25.03.2009, 23:39
    #35892331
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Нужно в таблице Scott-Tiger найти для любой пары сотрудников вывести их ближайшего общего начальника!!! кто знает как? 2 рекурсии как-то сделать?
...
Рейтинг: 0 / 0
26.03.2009, 00:27
    #35892375
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Разверни таблицу в вид сотрудник - начальник - дистанция, стартуя от двух сотрудников. Не забудь положить каждого сотрудника как "сам себе начальник, дистанция 0". Положи в with и сджойни саму с собой по условию начальник = начальник, сотрудник <> сотрудник. Выбери минимальную по сумме дистанций.
...
Рейтинг: 0 / 0
26.03.2009, 00:51
    #35892390
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
а код можно? как стартовать с 2-х id? так можно?
...
Рейтинг: 0 / 0
26.03.2009, 00:55
    #35892392
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
очень надо! помогите :) горят трубы!
...
Рейтинг: 0 / 0
26.03.2009, 03:58
    #35892465
SY
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
26.03.2009, 07:07
    #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
26.03.2009, 08:44
    #35892578
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
А вот как Softwarer писал реализовать бы. Мне нужно для каждой пары сотрудников вывести их минимального общего начальника. То есть взять все пары и для них найти начальника.
...
Рейтинг: 0 / 0
26.03.2009, 08:55
    #35892591
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Integer005Мне нужно для каждой пары сотрудников вывести их минимального общего начальника. То есть взять все пары и для них найти начальника.
Код: plaintext
select e1.empno, e2.empno, (<select_by_andreymx>) as "Шеф" from emp e1, emp e2;
...
Рейтинг: 0 / 0
26.03.2009, 09:01
    #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
26.03.2009, 09:23
    #35892623
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Integer005 и IN (:p1, :p2) Это что означает?Да-мс... Оказалось - бисер ...
...
Рейтинг: 0 / 0
26.03.2009, 11:12
    #35892966
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
А все же, напишите пожалуйста, если не тяжело, что значит max(max(empno)) почему 2 раза max. Keep dense_mark, in(:p1,:p2) что значит? Понимаю что для многих это очень просто. Напишите пожалуйста
...
Рейтинг: 0 / 0
26.03.2009, 12:18
    #35893260
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Обьясните просто как работает запрос написанный elic+andreymx!
...
Рейтинг: 0 / 0
26.03.2009, 14:44
    #35893844
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Integer005,

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

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

PS: Чтоб не было иллюзий .
...
Рейтинг: 0 / 0
26.03.2009, 20:54
    #35895002
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Непонятно назначение Keep, 2 раза max и dense_mark. Объясните пожалуйста для чего они здесь.
...
Рейтинг: 0 / 0
26.03.2009, 21:34
    #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
26.03.2009, 21:47
    #35895067
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
А Keep, dense_mark first для чего нужно? Max(max()) почему? Это описка?
...
Рейтинг: 0 / 0
26.03.2009, 22:03
    #35895088
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Integer005,

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


что означает эта строчка?
...
Рейтинг: 0 / 0
27.03.2009, 00:40
    #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
27.03.2009, 01:12
    #35895267
Integer005
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Having count(*)=2 это чтобы брать строки до тех пока не найдется общий потомок?
...
Рейтинг: 0 / 0
27.03.2009, 01:20
    #35895275
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Иерархический запрос
Integer005,

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

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


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