Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
SQL 2005

собственно вопрос так негде не нашёл
(кроме переноса нету информации)
как скопировать поддерево из текущего дерева (в другой нод) средствами sql и nested sets
включая смену индексов ?
без цикла разумеется

спасибо
24 сен 12, 13:11    [13212426]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
А в чём проблема? И причём тут "не описан метод", принцип понятен остальное элементарно.
И механизм то стандартный копирование от вставки в дерева ничем не отличается.

Проблема в том - Что копировать надо? Корень поддерева или лес.
К примеру если лес, то там нужно уточнить как, с сортировкой (слияние) или в край/место или подавно в лист.

Без слияния.
1. Создаём "дырку", как при вставке (апдейт таблы на дельту (количество) по условию (от места вставки)).
Незабываем обновить и задающие переменные.
2. Вставка отбираемого дерева с заменой ID (индексов Left, Right) на дельту (между местами копирования в вставки)

Сортировка посложнее, а слияние нодов (два одинаковых в один) это вообще цирк.
Практически во всех подходах, но в Parent меньше (если сортировка отдельно указана или логическая).
26 сен 12, 00:12    [13222190]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
вот именно как поменять индексы
если у меня поддерево со своей вложеностью ??
28 сен 12, 01:24    [13236121]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31785
michael R
вот именно как поменять индексы
если у меня поддерево со своей вложеностью ??
Вы даже модель данных не указали.

Вот Mnior думает, что вы используете дерево селко :-)
Mnior
индексов Left, Right
28 сен 12, 09:16    [13236503]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
автор
Вот Mnior думает, что вы используете дерево селко :-)

правильно он думает


я тут маленько навоял примерный скрипт
у меня есть ещё parent и уровень

truncate table Table_1 
insert into Table_1 (txt, parentId, lft, rgt ,id,depth) values('a0',0,1,12,1,1);
insert into Table_1 (txt, parentId, lft, rgt ,id,depth) values('a1',1,2,3,2,2);
insert into Table_1 (txt, parentId, lft, rgt ,id,depth) values('a2',1,4,11,3,2);
insert into Table_1 (txt, parentId, lft, rgt ,id,depth) values('a3',2,5,10,4,3);
insert into Table_1 (txt, parentId, lft, rgt ,id,depth) values('a4',3,6,9,5,4);
insert into Table_1 (txt, parentId, lft, rgt ,id,depth) values('a5',4,7,8,6,5);

 
declare @lftFrom int=1;
declare @rgtFrom int=12;
declare @lftTo int=7;
declare @rgtTo int=8;


DECLARE @parent int;
SET @parent = @rgtTo;

declare @size int;
SET @size = 2*( SELECT COUNT(*) FROM Table_1  WHERE lft>=@lftFrom and rgt<=@rgtFrom);

declare @lftmin int;
SET @lftmin = @lftFrom;

declare @depthFrom int;
SET @depthFrom = ( SELECT depth FROM Table_1  WHERE lft=@lftFrom and rgt=@rgtFrom);


declare @depthTo int;
declare @parentidTo int;
SELECT @depthTo = (depth) , @parentidTo=(id) FROM Table_1  WHERE lft=@lftTo and rgt=@rgtTo;


declare @TList table(idrow int primary key clustered);
insert into @TList(idrow)
select idrow from Table_1 
WHERE lft>=@lftFrom and rgt<=@rgtFrom
Order by lft;
declare @RowId int;
set @RowId=( select top 1 idrow from @TList);

declare @Table_2 table(
	[idRow] [int] IDENTITY(1,1) PRIMARY KEY CLUSTERED ,
	[txt] [nchar](10) NULL,
	[parentId] [int] NULL,
	[lft] [int] NULL,
	[rgt] [int] NULL,
	[id] [int] NULL,
	[depth] [int] NULL
 );


insert into @Table_2 ([txt] ,[parentId],[lft],[rgt] ,[id] , depth)
select B.txt as txt, case when B.idRow=@RowId then  @parentidTo else B.parentid end parentid , B.lft-@lftmin +1 as lft ,B.rgt-@lftmin+1 as rgt,B.[id] as id , depth-@depthFrom+1 as depth
from Table_1 B inner join @TList A on A.idRow= B.idRow
order by lft;



UPDATE Table_1 
	SET lft = CASE WHEN lft > @parent
				THEN lft + @size
				ELSE lft END,
		rgt = CASE WHEN rgt >= @parent
				THEN rgt + @size
				ELSE rgt END
WHERE rgt >= @parent;


INSERT INTO Table_1 (txt, parentId, lft, rgt ,id , depth)  
select txt, parentid , lft+@parent-1,(rgt+@parent-1 ),id , depth+@depthTo
from @Table_2 
order by lft;
    
 select * from Table_1 order by lft;



вопрос
как сделать что бы скопированное поддерево добавлялось в начало
а не в конец как в данном примере ?

Спасибо
28 сен 12, 12:05    [13237673]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R, блин
1. Вы так пишите запросы как будто не понимаете смысл nested-sets.
1.1. Left и Right поля уникальны, не нужно два условия по ним
1.2. Size уже из теории = (Right - Left + 1)/2, а не агрегатка Count(*), более это логичнее и правильнее и надёжнее (если например неправильно удалялось)
2. И так расфигачили, компактно писать надо. Самое главное зло для программиста это Лишнее.
3. Явно видно что вы думаете императивно. Ненужно никаких промежуточных вычислений.
Думайте абстрактно с корня, с верху, суть.
4. Семантические ошибки (@TList : IDRow, Top - бред вообще; со значением Parent ошиблись)
Да и вообще у меня не работает и бредом кажется.
5. Parent = 0, а не NULL моветон. На клиенте заменяйте или на крайняк VIEW +TRIGGER на неё.
+ Какова должна быть структура данных
CREATE TABLE dbo.TTable (
	 ID		Int		PRIMARY KEY
	,Name		VarChar(50)	NOT NULL
	,Parent		Int		    NULL REFERENCES dbo.TTable (ID)
	,IDLeft		Int		NOT NULL UNIQUE
	,IDRight	Int		NOT NULL UNIQUE
	,Depth		Int		NOT NULL
);
INSERT INTO dbo.TTable VALUES
 (1,'a0',NULL, 1,14,1)	--	|- a0
,(2,'a1',   1, 2, 3,2)	--	  |- a1
,(3,'a2',   1, 4,11,2)	--	  |- a2
,(4,'a3',   3, 5, 8,3)	--	    |- a3
,(5,'a4',   4, 6, 7,4)	--	      |- a4
,(6,'a5',   5, 9,10,3)	--	    |- a5
,(7,'a6',   1,12,13,2)	--	  |- a6

Короче, вот как я писал выше:
+ Одним запросом (без изменения данных)
WITH
  TTable AS (SELECT * FROM (VALUES
	 (1,'a0',NULL, 1,14,1)	--	|- a0
	,(2,'a1',   1, 2, 3,2)	--	  |- a1
	,(3,'a2',   1, 4,11,2)	--	  |- a2
	,(4,'a3',   3, 5, 8,3)	--	    |- a3
	,(5,'a4',   4, 6, 7,4)	--	      |- a4
	,(6,'a5',   5, 9,10,3)	--	    |- a5
	,(7,'a6',   1,12,13,2)	--	  |- a6
) TTable(ID,Name,Parent,IDLeft,IDRight,Depth)
),TParam AS (SELECT * FROM (VALUES
--	(4,  2)
--	(4,  5)
	(4,  6)
--	(4,  8)
--	(4 ,13)
--	(4,NULL)
) TParam(IDFrom,IDTo)
	CROSS JOIN (SELECT Max(ID),Max(IDRight) FROM TTable) M(IDMax,IDMaxRight)	-- Next PK
)	SELECT	 T.ID
		,T.Name
		,T.Parent
		,T.IDLeft	+ CASE WHEN T.IDLeft  >  P.IDTo THEN F.IDRight - F.IDLeft + 1 ELSE 0 END	AS IDLeft
		,T.IDRight	+ CASE WHEN T.IDRight >= P.IDTo THEN F.IDRight - F.IDLeft + 1 ELSE 0 END	AS IDRight
		,T.Depth
	FROM	           TParam	P
		      JOIN TTable	F  ON F .IDLeft  = P.IDFrom	-- Узнать количество/размер/диапазон
		CROSS JOIN TTable	T
UNION ALL
	SELECT	 T.ID		+ P.IDMax
		,T.Name		+ ' new'
		,CASE	WHEN T.IDLeft = P.IDFrom
			THEN IsNull(TB.ID,TE.ID)	ELSE
		 T.Parent	+ P.IDMax		END
		,T.IDLeft	- P.IDFrom + 1	+ Coalesce(TB.IDLeft,TE.IDRight - 1,P.IDMaxRight)
		,T.IDRight	- P.IDFrom + 1	+ Coalesce(TB.IDLeft,TE.IDRight - 1,P.IDMaxRight)
		,T.Depth	- F.Depth  + 1	+ Coalesce(TB.Depth ,TE.Depth,0)
	FROM	           TParam	P
		      JOIN TTable	F  ON F .IDLeft   = P.IDFrom	-- Узнать диапазон дочерних и атрибуты (Depth)
		LEFT  JOIN TTable	TB ON TB.IDLeft   = P.IDTo	-- Узнать в начало вставлять или в конец,
		LEFT  JOIN TTable	TE ON TE.IDRight  = P.IDTo	-- а также получить остальные атрибуты (Depth,ID)
		      JOIN TTable	T  ON T .IDLeft  >= F.IDLeft
					  AND T .IDRight <= F.IDRight
ORDER BY IDLeft
Уже можно воспользоваться MERGE.
+ С изменением
DECLARE	@Table TABLE (
	 ID		Int		PRIMARY KEY
	,Name		VarChar(50)	NOT NULL
	,Parent		Int		    NULL --REFERENCES @Table (ID)
	,IDLeft		Int		NOT NULL UNIQUE
	,IDRight	Int		NOT NULL UNIQUE
	,Depth		Int		NOT NULL
)INSERT	@Table VALUES
 (1,'a0',NULL, 1,14,1)	--	|- a0
,(2,'a1',   1, 2, 3,2)	--	  |- a1
,(3,'a2',   1, 4,11,2)	--	  |- a2
,(4,'a3',   3, 5, 8,3)	--	    |- a3
,(5,'a4',   4, 6, 7,4)	--	      |- a4
,(6,'a5',   5, 9,10,3)	--	    |- a5
,(7,'a6',   1,12,13,2)	--	  |- a6

DECLARE	 @IDFrom	Int	= 4
	,@IDTo		Int	= 6
--------------------------------------------------------------------------------
	,@IDMax		Int
	,@IDMaxRight	Int
	,@Range		Int
SELECT	 @IDMax		= M.IDMax
	,@IDMaxRight	= M.IDMaxRight
	,@Range		= F.IDRight - F.IDLeft + 1
FROM	(SELECT Max(ID),Max(IDRight) FROM @Table)	-- Next PK
			M(IDMax,IDMaxRight)
	JOIN @Table	F ON F.IDLeft = @IDFrom
-- Подготвливаем место
UPDATE	@Table
SET	 IDLeft	 += CASE WHEN IDLeft  >  @IDTo THEN @Range ELSE 0 END
	,IDRight += CASE WHEN IDRight >= @IDTo THEN @Range ELSE 0 END

INSERT	@Table
SELECT	 T.ID		+ @IDMax
	,T.Name		+ ' new'
	,CASE WHEN T.IDLeft = F.IDLeft THEN X.ID	ELSE
	 T.Parent	+ @IDMax			END
	,T.IDLeft	- @IDFrom + 1 + X.IDTo - CASE WHEN T.IDLeft  >  @IDTo + @Range THEN @Range ELSE 0 END
	,T.IDRight	- @IDFrom + 1 + X.IDTo - CASE WHEN T.IDRight >= @IDTo + @Range THEN @Range ELSE 0 END
	,T.Depth	- F.Depth + 1 + X.Depth
FROM	           @Table	F
	LEFT  JOIN @Table	TB ON TB.IDLeft   = @IDTo
	LEFT  JOIN @Table	TE ON TE.IDRight  = @IDTo + @Range
	CROSS APPLY (SELECT
		 CASE	WHEN TB.IDLeft  IS NOT NULL	THEN @IDTo
		 	WHEN TE.IDRight IS NOT NULL	THEN @IDTo - 1
		 					ELSE @IDMaxRight
		 	END
		,IsNull(TB.ID,TE.ID)
		,Coalesce(TB.Depth ,TE.Depth,0)
			)	X(IDTo,ID,Depth)
	      JOIN @Table	T  ON T .IDLeft  >= F.IDLeft
				  AND T .IDRight <= F.IDRight
WHERE	F.IDLeft = @IDFrom + CASE WHEN @IDFrom > @IDTo THEN @Range ELSE 0 END
--------------------------------------------------------------------------------
SELECT *,Repeat('-',Depth) + Name FROM @Table ORDER BY IDLeft
Могут быть помарки, т.к. не на MSSQL писал
Вторым параметром также регулируется куда вставлять, в начало или в конец. Только не обработан случай если вставляется в корень (Parent = NULL), в этом случае я жёстко прописал в конец, можно или добавить CASE, если только модель не такова, что может быть только один корневой элемент.

PS: PostgreSQL MUST DIE!!!
Ненавижу мутаторы. Не декларативный интерпретатор при декларативном синтаксисе. EPIC FAIL!
Это надо же, успешность результата зависит от внутреннего порядка обработки.
UPDATE Table SET PK = PK - 1 -- Ok
UPDATE Table SET PK = PK + 1 -- Key Violation
-- или наоборот, если DESC или выберится обратный порядок, при параллельности оба упадут
Кароче, нет замены для MSSQL
29 сен 12, 17:36    [13243733]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Это надо же, успешность результата зависит от внутреннего порядка обработки.
UPDATE Table SET PK = PK - 1 -- Ok
UPDATE Table SET PK = PK + 1 -- Key Violation
-- или наоборот, если DESC или выберится обратный порядок, при параллельности оба упадут
Мда, для этого надо всё время прописывать опцию INITIALLY DEFERRED
Они не понимаю смысла ни что такое транзакция, ни что такое логическая целостность. Это когда хвост виляет собакой.
Гореть им в аду!
30 сен 12, 00:50    [13244598]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
Mnior
спасибо
я попробую

Merge это для 2008
нету пока 2005


IDRow мне нужно для другого было
просто если множественная вставка одного и того же поддерева в разные куски дерева
у которых есть одинаковый ParentId (одно из условий данной структуры)
вот и стоит добавочное поле на уникальность
30 сен 12, 00:58    [13244609]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
мда

и UNION
и куча join

на таблицу с большим количеством данных
боюсь будет проблемно
30 сен 12, 01:14    [13244627]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
Mnior

я понял что тебя смутило
у меня ID не уникально
связка ID+Parent может повторяться

с Count(*) да я лоханулся
ну про RowId я уже написал

да сделать надо будет всё в одной транзакции
правда как менять индексы для моего примера пока нету


кстати твой пример не сработал
но я потом буду ковырять
30 сен 12, 01:45    [13244650]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
мда

и UNION
и куча join

на таблицу с большим количеством данных
боюсь будет проблемно
Вы бредите.
Где там UNUON? Там есть UNION ALL для запроса, который показывает только смысл задачи, он ничего не вставляет и носит чисто информационный характер.
В очередной раз убеждаюсь что вы не программист. JOIN это не проблема, и куча JOIN-ов тоже. Проблема когда их чертовски много.
Но главное когда левые запросы делают ужасные планы - как в вашем примере, с промежуточными таблами это точно пепец.

Логически тут нет JOIN-ов, тут всё идеально. Первые наборы в запросе всегда возвращают одну строку и запрашиваются в начале, а далее идёт скан одной таблицы. Неважно, сколько строк в таблице, всё будет летать максимально быстро, насколько это возможно.

MERGE я упомянул, как вариант, чтобы не усложнять логику. Посмотрите на основной запрос (второй), мне пришлось дописать лишние вычисления в INSERT, чтобы компенсировать изменения сделанные первой командой.
MERGE - это приглашение к дискуссии о подходах записи и решения задач. Оно вас не касается, а касается тех кто хочет быть не просто юзверем-обывателем.
30 сен 12, 01:47    [13244654]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
я же написал
промежуточные таблицы нужны мне для другого
считайте что их нет

всё остальное
один Update и один Insert
Merge у меня нет

промежуточные расчёты для переменных всё таки надеюсь делать быстрее не внутри CTE ?
30 сен 12, 02:01    [13244662]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
у меня ID не уникально
связка ID+Parent может повторяться
Ну для Nested-sets (и на решение) это не влияет совершенно. А то что оно не несёт тот смысл в названиях которых заложено - это ваши проблемы.
michael R
да сделать надо будет всё в одной транзакции
Очевидно.
michael R
правда как менять индексы для моего примера пока нету
Индексов нет для селко Тогда к чему весь этот цирк? Вы что пришли на форум издеваться?
michael R
просто если множественная вставка одного и того же поддерева в разные куски дерева
Doh
Вы ещё скажите версионные деревья.
Ну вот тут я бы тупо взял первый запрос и применил MERGE. Или даже согласился, что лучше засторить во времянку. Если бы не одно НО.
Оно вообще решаемо?
Вот если я задам: скопируй поддерево А в поддерево Б, а поддерево Б в А - одновременно, Или ещё хуже - через дерево В.
Мне кажется тут никто без полулитра не разберёт. Что наводит что или задача с потолка, или вы чего-то не договариваете.

А для множественной вставки я потом подумаю, но сходу ничего сложного, просто придётся агрегировать для первого UPDATE. Но вы напишите для какой задачи такое понадобилось.
30 сен 12, 02:05    [13244665]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
Merge у меня нет
Ну вы заладили, это было понятно с самого начала.
Только не вы одно на форуме. Не мешайте остальным.
michael R
промежуточные расчёты для переменных всё таки надеюсь делать быстрее не внутри CTE ?
Какой нафиг рекурсивный CTE? Вы о чём?
Или вы думаете что наличие слова WITH уже тормозит сервер.
Ну у вас и гуманитарные замашки. В заклинания верите? Программирование это не магия.
30 сен 12, 02:11    [13244668]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
ну у нас такое придумали
вернее пытаемся переделать
я конечно не всё рассказал

одновременно дерево A скопировать в дерево B
и потом наоборот наверно не нужно

но такое да нужно будет

[b]R
-E
  --A
  ---B
-C
 --D
-T
--A
---B
-Y
--O
---T
----A
-----B
[/b]

если я [D] копирую в какой нибудь [B]
то соответствено это должно быть скопированного во все [B]
ну поэтому мне будут нужно промежуточные таблицы ну и уникальный номер строчки

как то примерно так
30 сен 12, 02:16    [13244671]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
ну поэтому мне будут нужно промежуточные таблицы ну и уникальный номер строчки
Первое не обязательно, второе точно не нужно.

Но мне кажется что вы опять что-то недоговариваете.
По мне что-то тут не чисто. Тут явно можно всё сделать по другому. Графы всякие и т.п.
Но не зная задачу до конца точно не скажешь.
30 сен 12, 02:20    [13244676]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
ну а как реализовывать графы в SQL ?
я просто более простого решения не нашёл
как повторное использование промежуточной таблицы
с Update и Insert

рассказывать то особо то больше нечего
это правда !
30 сен 12, 02:25    [13244681]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Что не пост, то издёвка.
У дерева своя реализация/структура, у графа своя.
Граф это набор узлов и связей между ними. Т.е. обычно две таблы.
Если вы хотите связать D с двумя B, то на эти три записи-"узлы" ссылаются две записи-"связки".
Но бывают и другие варианты - зависит от задачи.

Как же сказать нечего, а зачем (1)копировать поддерево в (2)несколько мест?
30 сен 12, 02:34    [13244689]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
ну я же уже объяснил
самое простое решение было
копировать в одну таблицу те же ноды (с теми же родителями или менять родителя по необходимости)
и менять им индексы
всё
про графы я только спросил
никаких дополнительных таблиц нет и не будет
никто структуру таблиц менять не станет

у меня вопросы были
1 как менять индексы при копировании
2 и что бы вставленное поддерево был первым элементом
при данной структуре

1 вроде сделано и работает
2 пока нету

если зря отнял время - сорри
30 сен 12, 02:44    [13244693]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Откуда такая задача, копировать поддерево в несколько мест?
30 сен 12, 03:22    [13244699]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
установка сверху !
30 сен 12, 19:11    [13246033]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Я не спрашиваю причины, какова задача?

К примеру, для конфигурированию работы ALICE по столкновению протонов, стандартные наборы конфигураций копируется для разных значений диапазонов энергий. Или для ведения парраллельного бухгалтерского учёта, копируется дерево аналитических счетов. Или для создания фейковых сообществ пользователей в социальных сетях, копируются наборы атрибутов первоначальных "кукол". Или придумывание задачи с потолка под видом нужной с прикрытием задницы словами "Распоряжение благородных феодалов сверху - мне бездумному халопу".

Практически всегда иностранцы возмущаются, эти русские играют только в одни ворота - мне всё, взамен ничего. А мы как-то автоматически понимаем, что за каждую мелочь надо что-то давать взамен. Но гостей любят...
30 сен 12, 20:39    [13246283]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
автор
Практически всегда иностранцы возмущаются, эти русские играют только в одни ворота - мне всё, взамен ничего. А мы как-то автоматически понимаем, что за каждую мелочь надо что-то давать взамен. Но гостей любят...

улыбнуло
у нас иностранцев тоже любят


задача есть
условное название - множественное использование категорий

есть категория\товар это может быть
1 ноде без иерархии
2 ноде с иерархией
в случаи добавки в ноде поддерева
везде где существует данный ноде автоматически должно добавиться данное поддерево
зачем нужно именно так ?
возможно что определённые куски дерева обслуживают разные пользователи
и в каждом из случаев существуют разные условия показа данного дерева или поддерева
поэтому существует дупликация
кроме копирования разумеется есть и перетягивание
и создание нового нода
ну есть ещё ряд условий
ну это просто доп. информация к задачи


я правда так и не понял чем данная постановка задачи поможет ответить на мой вопрос
менять логику и структуру никто уже не будет...........
30 сен 12, 22:27    [13246653]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
michael R
2. ноде с иерархией
в случаи добавки в ноде поддерева
Это поддерево это что?
Тоже {категория | товар} ?
michael R
везде где существует данный ноде автоматически должно добавиться данное поддерево
Всем товарам данной категории?
michael R
возможно что определённые куски дерева обслуживают разные пользователи
и в каждом из случаев существуют разные условия показа данного дерева или поддерева
Что-то невразумительное.
Получается явно в дереве хранится "видимость".
Т.е. не просто копирование, но и модификация видимости, каждый раз.
+ филасоффия
michael R
менять логику и структуру никто уже не будет
Это почему? Лень?
С продуктом будут работать люди, или вам наплевать насрать на них?

Оно же быдло (возможно даже явно платит за продукт), оно обязано мучится. Мы же в Россея живём, тут всегда так с ближним ...
Ёбнутая на голову филасоффия: Не нае%ёшь не паживёшь.
Поэтому все друг друга так еб "любят".
1 окт 12, 12:50    [13248935]     Ответить | Цитировать Сообщить модератору
 Re: опять про nested sets копирование нодов(поддерева)  [new]
michael R
Member

Откуда: из-за границы
Сообщений: 2113
клиентам глубоко пох как построена база данных
им нужна видимость в дерева - да
и это их пожелание
(но сами данные о товаре\категории находится в другой таблице)
в данной таблице только IDs индексы и статус показа на разных уровнях если есть такое


вопрос стоял совсем просто
как в том скрипте что я выставил
поменять индексы ,что бы вставляемое дерево было первым элементом , а не последним
и всё !
за мелкие оптимизации спасибо конечно, но это было не главное


ладно
понятно
закрывайте тему
1 окт 12, 18:26    [13251875]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить