powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Получить родителя
11 сообщений из 11, страница 1 из 1
Получить родителя
    #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
Получить родителя
    #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
Получить родителя
    #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
Получить родителя
    #32017288
папа Карло
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя есть шанс сделать модель нормальной?
...
Рейтинг: 0 / 0
Получить родителя
    #32017304
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я согласен с папа Карло, лучше сменить модель, с такой работать будет сложно.
Если для этого есть препятствие, то могу посоветовать такой вариант выборки:
Шаг 1 - выбрать все записи, имеющие родителей, т.е. часть значения поля до последней точки = полю родителя.
Шаг 2 - выбрать все записи за исключением найденных на шаге 1.
...
Рейтинг: 0 / 0
Получить родителя
    #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
Получить родителя
    #32017378
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 AL_R.
Привет! Рад тебя тут лицезреть. Только, похоже, ты впопыхах листал топики этой ветки и не до конца понял суть вопроса. Твое решение подразумевает хранение дерева не в одной записи, а в нескольких. А у автора вопроса все эти ветки - это одно значение, которое еще предстоит разобрать по полочкам.
IMHO, задача имеет решение. Но уж больно она неизящная. Просто руки от нее отдергиваются. Похоже, автор вопроса плохо продумал структуру данных. Возможно, что его подход содержит просто концептуальную ошибку. Предлагаю ему помедитировать над п.4 моего предыдущего топика.
...
Рейтинг: 0 / 0
Получить родителя
    #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
Получить родителя
    #32017422
bitof
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем спасибо

стратегу garе:

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


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