Добро пожаловать, Гость
Логин: Пароль: Запомнить меня
SQL, PL/SQL, T-SQL: запросы, DML DDL операторы, пакеты, процедуры, функции, триггеры и последовательности.
  • Страница:
  • 1
  • 2
  • 3

ТЕМА: Поиск по дереву в Oracle

Поиск по дереву в Oracle 22 июль 2011 03:57 #2719

  • Jack
  • Jack аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 45
  • Спасибо получено: 0
Всем привет. Столкнулся с проблемой (9i):

Есть табличка (сокращенная)
create table hr_archive (

id number,

programme varchar2(100),

episode varchar2(100),

parent_id number

)
Нужно построить запрос, который вернет дерево с учетом текстового поиска по полям (programme & episode), причем важно, если на любом и уровней ветки поиск успешен - то должна выводиться вся ветка.
Пробовал запрос
select * from hr_archive

where upper(episode) like '%INT%' or  upper(programme) like '%INT%'

start with parent_id = -1

connect by prior id = parent_id

Но естественно, ветки целиком не возвращаются.
Буду рад любым идеям.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по дереву в Oracle 22 июль 2011 03:59 #2720

  • Pond
  • Pond аватар
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 47
  • Спасибо получено: 0
Возникает вопрос относительно поддеревьев. Если есть:

1 ABC-INT
-- 2 BCD
3 CDE-INT
4 DEF

то получается что
a) первый раз должно быть выбрано вся ветвь 1 ABC-INT а второй раз ветвь 3 CDE-INT
b) или только один раз 1 ABC-INT (а подветви при повторном совпадении уже не выводятся)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по дереву в Oracle 22 июль 2011 04:00 #2721

  • Jack
  • Jack аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 45
  • Спасибо получено: 0
Да действительно, я забыл уточнить...
Вариант b.
Подветви при повторном совпадении не выводятся вторично.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по дереву в Oracle 22 июль 2011 04:01 #2722

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

Может быть решением является построение всех возможных ветвей начиная с перебора стартового ID снизу, при удовлетворении условиям текстового поиска в родительской записи. А затем из этого набора строк построения конечного дерева. Это первое, что приходит в голову.

Хотя кажется есть целый раздел математики, изучающий графы :-)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по дереву в Oracle 22 июль 2011 04:02 #2723

  • Jack
  • Jack аватар Автор темы
  • Не в сети
  • Новый участник
  • Новый участник
  • Сообщений: 45
  • Спасибо получено: 0
мда :(
а если упростить задачу? известно что уровней может быть от 1 до 3 и поиск нужно производить только на 1 и 3 уровне (2ой не важен но в выборке должне присутствовать).

По идее это же "стандартная" задача. Найти все ветви в которых встречаются опред. значения.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Re: Поиск по дереву в Oracle 22 июль 2011 04:02 #2724

может тогда псевдостолбцы level и rownum как-то помогут?
Т.е. получить выборку во временную таблицу с двумя дополнительными полями в которые поместить значения level и rownum от первой выборки, а затем по этим данным отобрать необходимые ветви?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

  • Страница:
  • 1
  • 2
  • 3