С Новым годом! Форум программистов, компьютерный форум, киберфорум
Oracle
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 08.04.2016
Сообщений: 24

Куда добавлять условие в иерархический запрос?

14.05.2016, 22:37. Показов 3434. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Условие:
Выведите иерархию подчинений воинских подразделений сверху вниз, начиная с полка 'Regiment #1271A',
и численность личного состава, приписанного непосредственно к подразделению.
Все подчиненные подразделения должны располагаться "лесенкой" с отступом, равным 3-м пробелам.
О каждом подразделении выводить: название, численность.
Regiment #1271A 1
First Company 1
Platoon #1 0
Platoon #2 1
... ...
Дополнительное условие - НЕ выводить те подразделения (а также подчиненные им подразделения), которые не имеют в составе ни одного военнослужащего


Код, который 100% работает, но не учитывает последнее условие
SQL
1
2
3
4
SELECT lpad(' ', 3*(level-1))|| name AS name, (SELECT COUNT(*) FROM staff b WHERE a.unit_id = b.unit_id) AS COUNT
FROM military_units a
START WITH name='Regiment #1271A'
CONNECT BY parent_id = prior unit_id
Выводится вот такая штука:
(подчеркнуто то, что должно быь удалено из таблицы)
14 rows selected
NAME COUNT
Regiment #1271A 1
First Company 1
Platoon #1 0
Platoon #2 1
Squad #3 4
Platoon #3 1
Squad #1 6
Squad #2 6
Second Company 1
Platoon #4 1
Squad #4 1
Squad #5 0
Platoon #5 0
Squad #6 1



Условие count>0 не работает, так как ещё и Squad #6 должен удалиться, хоть у него и есть 1 человек.
Подскажите, как вообще такое решать? И где посмотреть примеры на подобные темы?( Гуглятся только статьи с хабра с теорией((( )

Добавлено через 12 минут
Теперь вопрос в следующем, можно ли это по-другому написать? Вроде работает, но время выполнения адово большое(

Oracle 11 SQL
1
2
3
4
5
SELECT LPAD(' ', 3*(level-1))|| name AS name, (SELECT COUNT(*) FROM staff b WHERE a.unit_id = b.unit_id) AS COUNT
FROM military_units a
WHERE (SELECT COUNT(*) FROM staff b WHERE a.unit_id = b.unit_id)>0
START WITH name='Regiment #1271A'
CONNECT BY parent_id = PRIOR unit_id  AND PRIOR (SELECT COUNT(*) FROM staff b WHERE a.unit_id = b.unit_id)>0
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.05.2016, 22:37
Ответы с готовыми решениями:

Иерархический запрос
Иерархический запрос по двум таблицам. Как написать запрос, что бы получить дерево. Дано: Две таблицы: tab1, tab2. ...

Иерархический запрос
Здравствуйте. Читаю вот эту статью https://habr.com/post/43955/. Там есть такой абзац "Условие после CONNECT BY нужно указать...

Иерархический запрос
Добрый вечер! Нужна ваша помощь. Имеется иерархический запрос, который строит представление. Суть проблемы в том, что в какой-то момент...

1
476 / 239 / 114
Регистрация: 12.05.2016
Сообщений: 647
15.05.2016, 00:02
Лучший ответ Сообщение было отмечено dsciencebk как решение

Решение

Ну неудивительно, вы на каждую строку вызываете подзапрос с подсчетом количества.

Посчитайте количество в каждом подразделении заранее, одним проходом, а потом уже по подсчитанному стройте иерархию

SQL
1
2
3
4
5
6
7
8
9
10
11
WITH unit_count AS(
  SELECT a.unit_id, a.parent_id, a.name, COUNT(b.unit_id) cnt 
  FROM military_units a, staff b
  WHERE b.unit_id(+) = a.unit_id
  GROUP BY a.unit_id, a.parent_id, a.name
 
)
SELECT LPAD(' ', 3 * (LEVEL - 1)) || NAME AS NAME, cnt
FROM unit_count
START WITH NAME = 'Regiment #1271A' AND cnt > 0
CONNECT BY parent_id = PRIOR unit_id AND cnt > 0
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
15.05.2016, 00:02
Помогаю со студенческими работами здесь

CONNECT BY иерархический запрос
У меня есть несколько таблиц, из них я при помощи запроса SELECT a3.MANAG_NUMB, a3.PARENT_MANAG_NUMB, a3.MANAG_NAME, SUM(a4.PRICE) ...

Построить иерархический запрос
Добрый день, проблема описана в заголовке. Средствами языка (c#) я могу её решить выбрав просто записи а затем сгруппировать, но это не...

Есть ли у SQL SERVER иерархический запрос
Есть ли у SQL SERVER иерархический запрос аналогичный Оракловому select * from <name> connect by prior Спасибо

Иерархический запрос из двух таблиц в PL/SQL
Здравствуйте. Есть 2 таблицы в pl/sql с именами test_litv1 и test_litv2. Нужно составить процедуру, выводящую иерархическую структуру по 2м...

Куда им как добавлять код JS в WP?
Куда им как добавлять код JS в WP? есть плагин Divi - это типа вижин композера, добавляю поле "код" на страницу, там есть поля...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru