powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос
13 сообщений из 38, страница 2 из 2
Иерархический запрос
    #35895288
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Был бы сейчас oracle на руках, разобрался бы давно. А так в голове пытаешься представить что делает подзапрос. А так бы видел результат, тестировал и понял смысл работы каждого элемента конструкции.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35895348
Integer005А вот как Softwarer писал реализовать бы. Мне нужно для каждой пары сотрудников вывести их минимального общего начальника. То есть взять все пары и для них найти начальника.Практически дословная реализация идеи . Единственное, что я, наоборот, решил исключить сотрудника из "начальника самому себе"

Код: 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.
with
--
-- Взращивание "бамбуковой рощицы" "вертекалей власти" 
-- для каждого сотрудника:
  trees as
    (
      select empno, ename, level as lvl,
             trim(',' from sys_connect_by_path(decode(level, 1 ,empno),',')) as tree_id,
             trim(',' from sys_connect_by_path(decode(level, 1 ,ename),',')) as tree_name
        from emp
      connect by prior mgr = empno
    )
--
-- Построение всевозможных пар сотрудников 
-- и поиск ближайшего общего босса:
select max(least(t1.tree_name, t2.tree_name)) as ename_1,
       max(greatest(t1.tree_name, t2.tree_name)) as ename_2,
       max(t1.ename) keep(dense_rank first order by t1.lvl)as boss_name
  from trees t1
  join trees t2
    on t1.empno = t2.empno
   and t1.tree_id != t2.tree_id
   and t1.lvl !=  1  
   and t2.lvl !=  1 
 group by least(t1.tree_id, t2.tree_id), greatest(t1.tree_id, t2.tree_id)
 order by  1 , 2 ;

Query finished, retrieving results...

<== Для просмотра результата запроса жмыкать тут
Код: 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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
ENAME_1   ENAME_2   BOSS_NAME
-------   -------   ---------
ADAMS     ALLEN     KING       
ADAMS     BLAKE     KING       
ADAMS     CLARK     KING       
ADAMS     FORD      JONES      
ADAMS     JAMES     KING       
ADAMS     JONES     KING       
ADAMS     MARTIN    KING       
ADAMS     MILLER    KING       
ADAMS     SCOTT     JONES      
ADAMS     SMITH     JONES      
ADAMS     TURNER    KING       
ADAMS     WARD      KING       
ALLEN     BLAKE     KING       
ALLEN     CLARK     KING       
ALLEN     FORD      KING       
ALLEN     JAMES     BLAKE      
ALLEN     JONES     KING       
ALLEN     MARTIN    BLAKE      
ALLEN     MILLER    KING       
ALLEN     SCOTT     KING       
ALLEN     SMITH     KING       
ALLEN     TURNER    BLAKE      
ALLEN     WARD      BLAKE      
BLAKE     CLARK     KING       
BLAKE     FORD      KING       
BLAKE     JAMES     KING       
BLAKE     JONES     KING       
BLAKE     MARTIN    KING       
BLAKE     MILLER    KING       
BLAKE     SCOTT     KING       
BLAKE     SMITH     KING       
BLAKE     TURNER    KING       
BLAKE     WARD      KING       
CLARK     FORD      KING       
CLARK     JAMES     KING       
CLARK     JONES     KING       
CLARK     MARTIN    KING       
CLARK     MILLER    KING       
CLARK     SCOTT     KING       
CLARK     SMITH     KING       
CLARK     TURNER    KING       
CLARK     WARD      KING       
FORD      JAMES     KING       
FORD      JONES     KING       
FORD      MARTIN    KING       
FORD      MILLER    KING       
FORD      SCOTT     JONES      
FORD      SMITH     JONES      
FORD      TURNER    KING       
FORD      WARD      KING       
JAMES     JONES     KING       
JAMES     MARTIN    BLAKE      
JAMES     MILLER    KING       
JAMES     SCOTT     KING       
JAMES     SMITH     KING       
JAMES     TURNER    BLAKE      
JAMES     WARD      BLAKE      
JONES     MARTIN    KING       
JONES     MILLER    KING       
JONES     SCOTT     KING       
JONES     SMITH     KING       
JONES     TURNER    KING       
JONES     WARD      KING       
MARTIN    MILLER    KING       
MARTIN    SCOTT     KING       
MARTIN    SMITH     KING       
MARTIN    TURNER    BLAKE      
MARTIN    WARD      BLAKE      
MILLER    SCOTT     KING       
MILLER    SMITH     KING       
MILLER    TURNER    KING       
MILLER    WARD      KING       
SCOTT     SMITH     JONES      
SCOTT     TURNER    KING       
SCOTT     WARD      KING       
SMITH     TURNER    KING       
SMITH     WARD      KING       
TURNER    WARD      BLAKE      

 78  row(s) retrieved
...
Рейтинг: 0 / 0
Иерархический запрос
    #35897279
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005Думаю сарказм неуместен. Будь я дома за компом, я после первого же совета, сел за комп и за изучение и сделал бы. А то что я не уделял должное внимание предмету моя вина и преподавателя ввиду непоследовательности обучения. Если я не силен в базах, то это далеко не значит вы умнее. У всех свои преимущества. А тяга к знаниям наоборот красит. Просто сейчас такая ситуация, что нет никакой документаци

Это не тяга к знаниям. Это желание выучить китайский язык по методичке в курилке за час до экзамена. Не верю, что Вы можете зайти на sql.ru и не можете добраться сюда .
...
Рейтинг: 0 / 0
Иерархический запрос
    #35897501
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
suPPLerInteger005Думаю сарказм неуместен. Будь я дома за компом, я после первого же совета, сел за комп и за изучение и сделал бы. А то что я не уделял должное внимание предмету моя вина и преподавателя ввиду непоследовательности обучения. Если я не силен в базах, то это далеко не значит вы умнее. У всех свои преимущества. А тяга к знаниям наоборот красит. Просто сейчас такая ситуация, что нет никакой документаци

Это не тяга к знаниям. Это желание выучить китайский язык по методичке в курилке за час до экзамена. Не верю, что Вы можете зайти на sql.ru и не можете добраться сюда . вот Вы смешной. Документацию думаете не читал. Msdn это святое :) я и не спорю что это задание мне надо сделать было быстро и на коленках без знаний. Но от учебы никуда не деться. Сейчас руки до оракла не дошли,но скоро дойдут. Вы в одном хорошо разбираетесь, я в другом. Но и оракл от меня не уйдет. Не переживайте.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35897523
Фотография suPPLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Integer005,

Да я как-то не переживаю... Вот только MSDN не сильно Вам с с вопросами по Ораклу поможет. Но Вы пробуйте, не сдавайтесь. Удачи Вам завтра.
...
Рейтинг: 0 / 0
Иерархический запрос
    #35897612
Integer005
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я знаю что msdn не из этой оперы, но она как базовая документация к c++, так и ваша ссылка к ораклу база. я умею с этим работать свободно. просто так получилось. всем большое спасибо! простите за мою безграмотность в этом вопросе!
...
Рейтинг: 0 / 0
Иерархический запрос
    #35903974
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну как результат?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Иерархический запрос
    #39354516
wlyaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andreymx,
Не могу понять, зачем нам на этом этапе понадобилось брать MAX(EMPNO)? Ведь мы группируем по нему, и без MAX будет такой же результат? Или быть может я просто не могу смоделировать ту ситуацию, при которой не будет такого же результата.
Код: plsql
1.
2.
3.
4.
5.
SELECT MAX(EMPNO), MIN(LEVEL), COUNT(*) 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno 
...
Рейтинг: 0 / 0
Иерархический запрос
    #39354535
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlyaman,

Вообще здесь вложенные агрегаты. Сначала находятся родители, которые общие для стартовых узлов, потом из них выбирается с минимальным уровнем (наиболее далекий от корня иерерхии учитывая старт).
...
Рейтинг: 0 / 0
Иерархический запрос
    #39354539
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
with t as
(select 2 id, 0 id_parent from dual
union all select 10 id, 2 id_parent from dual
union all select 3 id, 10 id_parent from dual
union all select 4 id, 10 id_parent from dual
union all select 5 id, 4 id_parent from dual)
select 
max(id) keep (dense_rank first order by min(level)) x1,
min(id) keep (dense_rank first order by min(level)) x2,
max(id) y1,
min(id) y2
from t
start with id in (5, 4)
connect by prior id_parent = id
group by id
having count(*) = 2
/



Код: plaintext
1.
2.
3.
        X1         X2         Y1         Y2
---------- ---------- ---------- ----------
         4          4         10          2
1 row selected.
...
Рейтинг: 0 / 0
Иерархический запрос
    #39355026
wlyaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dbms_photoshopwlyaman,

Вообще здесь вложенные агрегаты. Сначала находятся родители, которые общие для стартовых узлов, потом из них выбирается с минимальным уровнем (наиболее далекий от корня иерерхии учитывая старт).

Вы меня, скорее всего, не так поняли. Я имею ввиду, зачем писать:
Код: plsql
1.
2.
3.
4.
5.
SELECT MAX(EMPNO), MIN(LEVEL), COUNT(*) 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno



Ведь можно написать так, и ничего не поменяется:
...
Рейтинг: 0 / 0
Иерархический запрос
    #39355027
wlyaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wlyamandbms_photoshopwlyaman,

Вообще здесь вложенные агрегаты. Сначала находятся родители, которые общие для стартовых узлов, потом из них выбирается с минимальным уровнем (наиболее далекий от корня иерерхии учитывая старт).

Вы меня, скорее всего, не так поняли. Я имею ввиду, зачем писать:
Код: plsql
1.
2.
3.
4.
5.
SELECT MAX(EMPNO), MIN(LEVEL), COUNT(*) 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno



Ведь можно написать так, и ничего не поменяется:

Не дописал.
dbms_photoshopwlyaman,

Вообще здесь вложенные агрегаты. Сначала находятся родители, которые общие для стартовых узлов, потом из них выбирается с минимальным уровнем (наиболее далекий от корня иерерхии учитывая старт).

Вы меня, скорее всего, не так поняли. Я имею ввиду, зачем писать:
Код: plsql
1.
2.
3.
4.
5.
SELECT MAX(EMPNO), MIN(LEVEL), COUNT(*) 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno



Ведь можно написать так, и ничего не поменяется:
Код: plsql
1.
2.
3.
4.
5.
SELECT EMPNO, MIN(LEVEL), COUNT(*) 
  FROM EMP 
CONNECT BY empno = PRIOR mgr 
START WITH empno IN (:p1, :p2) 
GROUP BY empno
...
Рейтинг: 0 / 0
Иерархический запрос
    #39355042
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wlyaman,

Да, двойная функция избыточна.
Более того, после (первой) группировки ID становится уникальным, так что без разницы какую из функций max/min/avg/sum etc
использовать в случае указания keep.
...
Рейтинг: 0 / 0
13 сообщений из 38, страница 2 из 2
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Иерархический запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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