Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить родителя / 11 сообщений из 11, страница 1 из 1
19.11.2001, 15:37
    #32017274
bitof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
есть древовидное поле:
1
1.1
1.2
1.2.1
1.3
2.1
2.2.3
2.2.3.1
2.3
3.4
3.5.6
3.6
3.6.1
3.6.1.1
3.6.1.2
4
4.2
...
и т.д.

надо бы извлечь родителя каждой ветки
т.е. в данном примере это будет
1
2.1
2.2.3
2.3
3.4
3.5.6
3.6
4

какие будут идеи?
...
Рейтинг: 0 / 0
19.11.2001, 17:26
    #32017276
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
Честно говоря, ничего не понял. Молчание других говорит, скорее всего, что они не поняли тоже.
Вопросы по-порядку.
1. Что означает фраза "древовидное поле"? Может быть, это не поле, а таблица, в которой логически организуется дерево с помощью некого поля (классика - это ссылка на родительскую запись)?
2. В приведенном примере т.н. значение поля - это значение одного поля одной записи или это несклько значений одного поля (по множеству записей)?
3. Что подразумевается под фразой "родитель каждой ветки"? Ветка - это совокупность записей, среди которых может быть множество родителей и детей. Родитель всех веток - это корень дерева (если только это действительно дерево).
4. Почему в приведенном примере не все ветки начинают свою адресацию от корня? Как должен интерпретироваться подобный пример:
1.1.1.1
1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1
Сколько тут веток? Одна или две? Если две, то как ты определяешь количество веток в таком примере:
1.1
1.1.1
Где гарантия, что вторая строка - не начало новой ветки?
А в этом примере сколько веток:
1.1
1.1

5. Может, сначала привести мысли в порядок, а тогда и вопросы отпадут?
...
Рейтинг: 0 / 0
19.11.2001, 17:54
    #32017279
bitof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
н-да... были у меня подозрения, что выразился я неаккуратно прямо скажем

итак, еще раз.

никакой таблицы с ссылками на родителей, т.е. это НЕ классический граф.

есть два поля.
Tree varchar(100) --содержит записи типа 1; 1.1; 1.1.2; 2; 2.1; 2.1.1;... ; и т.д.
Summ int
нужно получить рекордсет состоящий из записей которые представляют собой МИНИМАЛЬНО возможную длину значений поля tree и имеющие ОБЩИЙ корень с другими значениями tree.
то есть. если представить три записи
1.2 100
1.3 200
1.3.1 300

1.2 не имеет общего корня среди оставшихся значений, кроме самого себя. т.е. эта запись войдет в рекордсет
1.3 имеет общий корень с 1.3.1, и является родителем для значения 1.3.1, значит второе значение рекордсета - 1.3
получаем две записи
1.2 100
1.3 200

Под ветками я подразумевал совокупность записей имеющих одного общего родителя (1.3 и 1.3.1 - одна ветка) и она не обязательно имеет корень 1 или 2 или 3 или любое другое целочисленное значение.

Сейчас более доходчиво?
...
Рейтинг: 0 / 0
20.11.2001, 00:53
    #32017288
папа Карло
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
У тебя есть шанс сделать модель нормальной?
...
Рейтинг: 0 / 0
20.11.2001, 07:56
    #32017304
Владимир Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
Я согласен с папа Карло, лучше сменить модель, с такой работать будет сложно.
Если для этого есть препятствие, то могу посоветовать такой вариант выборки:
Шаг 1 - выбрать все записи, имеющие родителей, т.е. часть значения поля до последней точки = полю родителя.
Шаг 2 - выбрать все записи за исключением найденных на шаге 1.
...
Рейтинг: 0 / 0
20.11.2001, 12:21
    #32017334
AL_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
begin tran
create table #t (f varchar(20))

insert into #t (f) values('1')
insert into #t (f) values('1.1')
insert into #t (f) values('1.2')
insert into #t (f) values('1.2.1')
insert into #t (f) values('1.3')
insert into #t (f) values('2.1')
insert into #t (f) values('2.2.3')
insert into #t (f) values('2.2.3.1')
insert into #t (f) values('2.3')
insert into #t (f) values('3.4')
insert into #t (f) values('3.5.6')
insert into #t (f) values('3.6')
insert into #t (f) values('3.6.1')
insert into #t (f) values('3.6.1.1')
insert into #t (f) values('3.6.1.2')
insert into #t (f) values('4')
insert into #t (f) values('4.2')

select * from #t t1
where not exists(select * from #t t2 where len(t2.f) < len(t1.f) and t1.f like t2.f + '%')
rollback
...
Рейтинг: 0 / 0
20.11.2001, 19:18
    #32017378
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
2 AL_R.
Привет! Рад тебя тут лицезреть. Только, похоже, ты впопыхах листал топики этой ветки и не до конца понял суть вопроса. Твое решение подразумевает хранение дерева не в одной записи, а в нескольких. А у автора вопроса все эти ветки - это одно значение, которое еще предстоит разобрать по полочкам.
IMHO, задача имеет решение. Но уж больно она неизящная. Просто руки от нее отдергиваются. Похоже, автор вопроса плохо продумал структуру данных. Возможно, что его подход содержит просто концептуальную ошибку. Предлагаю ему помедитировать над п.4 моего предыдущего топика.
...
Рейтинг: 0 / 0
21.11.2001, 07:44
    #32017411
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
у меня так получилось(дополнение к скрипту AL_R)
SELECT f.f child, p.f parent from #t f left outer join #t p
on patindex('%.%',f.f)<>0 and p.f=substring(f.f,1,datalength(f.f)-patindex('%.%',reverse(f.f)))
...
Рейтинг: 0 / 0
21.11.2001, 09:18
    #32017422
bitof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
всем спасибо

стратегу garе:

структуру базы продумывал не я.
задача единоразовая, т.е. есть необходимость делать такие операции раз в какое-то время и все.
априори эта зача _никакой_ связи с классическими деревьями не имеет
...
Рейтинг: 0 / 0
21.11.2001, 14:25
    #32017465
AL_R
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
2 Garya
Привет, привет!
Судя по приведенному жалаемому результату, дерево и хранится в разных записях. Поэтому данная конкретная задача свелась к поиску "наменьшей общей подстроки".
...
Рейтинг: 0 / 0
26.11.2001, 12:31
    #32017812
Bison
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить родителя
есть классная статья:
Иерархические структуры, не требующие сопровождения. Ицик Бен-Ган
http://www.osp.ru/win2000/sql/2001/05/967.htm
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить родителя / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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