Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0) / 18 сообщений из 18, страница 1 из 1
15.10.2002, 11:18:36
    #32058287
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Есть у меня табличка в которой несколько полей и одно из них идентификатор товара. Товар представлен другой таблицей в которой иерархическая структура. Т.е есть группы товара и просто товары расположенные в группах. Глубина вложенности 10 уровней.

И есть у меня хранимая процедура которая по Id товара строит полный код товара (т.е. строку состоящую из Id всех владельцев данного товара). Построенный Id она возвращает в OUTPUT параметре.

Задача отсортировать указанную табличку по полному коду. Т.е. добавить в нее поле "Полный код" заполнить его значениями, и отсортировать (или сделать SELECT.... ORDER BY)

Помогиет сделать это _быстро_ потому как я не нашел никакого другого варианта кроме как использовать курсор. Но получается слишком медленно.

Хотелось бы что нибудь вроде
Код: plaintext
1.
UPDATE Talble1 SET Full_id = Get_full_ID(T_id)

Но как это сделать в MS SQL 7.0?????
...
Рейтинг: 0 / 0
15.10.2002, 12:14:34
    #32058313
ms
ms
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
все верно, и если значение Full_id можно сформировать одним SELECTOM
то
Код: plaintext
1.
UPDATE Talble1 SET Full_id = (SELECT//ваше условие..//)
...
Рейтинг: 0 / 0
15.10.2002, 12:21:25
    #32058318
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
все верно, и если значение Full_id можно сформировать одним SELECTOM
то


Как раз нельзя. Я полный код делаю Несколкими SELECT-ами в цикле пока не дойду до верхнего уровня дерева.

Может кто расскажет как сделать полный код одним селектом при условии что дерево основано на двух полях Id и ParentId/ Причем полный код должен начинаться с Id корня дерева и заканчиватся Id элемента
...
Рейтинг: 0 / 0
15.10.2002, 13:11:26
    #32058344
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
имхо, если вложенность ограничена, должно быть что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare @ID int
set @ID=  7   -- интересующий код элемента справочника
 
 -- таблица test: справочник, в котором поле ID - собственный код, ParentID - код "родителя"
 

select 	CAST(isnull(t10.ID,  0 ) as char( 10 ))+'->'+
	CAST(isnull(t9.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t8.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t7.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t6.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t5.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t4.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t3.ID,  0 )  as char( 10 ))+'->'+
	CAST(isnull(t2.ID,  0 )  as char( 10 ))+'->'+
	CAST(t1.ID as char( 10 )) from test t1
left join test t2  on (t2.ID  = t1.ParentID)
left join test t3  on (t3.ID  = t2.ParentID)
left join test t4  on (t4.ID  = t3.ParentID)
left join test t5  on (t5.ID  = t4.ParentID)
left join test t6  on (t6.ID  = t5.ParentID)
left join test t7  on (t7.ID  = t6.ParentID)
left join test t8  on (t8.ID  = t7.ParentID)
left join test t9  on (t9.ID  = t8.ParentID)
left join test t10 on (t10.ID = t9.ParentID)
where t1.ID = @ID
...
Рейтинг: 0 / 0
15.10.2002, 13:13:27
    #32058346
Александр Степанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Вам надо сделать процедуру, расчитывающую пути для все таблицы целиком, а не для одного товара. Что-то вроде этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
create table goods
(
	id int identity( 1 , 1 ) not null primary key clustered,
	parentid int null
)
go

alter table goods add constraint FK_goodsPARENTID_goodsID foreign key(parentid) references goods(id)
create index IX_goods_PARENTID on goods(parentid)
go

insert into goods(parentid) values(null)
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 4 )
insert into goods(parentid) values( 9 )
go

create procedure getFullPath
As
create table #tmp
(
	id int not null,
	parentid int null,
	path varchar( 7500 ) not null,
	[level] int not null
)
DECLARE @Level int
Set @Level= 1 

insert into #tmp
Select
	*,
	LEFT('000000000'+cast(id As varchar( 10 )), 10 ),
	@Level
From
	goods
Where
	parentid is null

while @@rowcount> 0 
BEGIN
	Set @Level=@Level+ 1 
	INSERT INTO #tmp
	Select
		g.*,
		t.path+'.'+RIGHT('000000000'+cast(g.id As varchar( 10 )), 10 ),
		@Level
	From
		goods g
		inner join #tmp t
			on t.id=g.parentid and t.[level]=@Level- 1 
END

Select * from #tmp 
GO

exec getFullPAth
GO

drop procedure getFullPath
go
drop table goods
go
 /*
Результат:
id          parentid    path                                            level       
----------- ----------- -------------------------------------------- ----------- 
1           NULL        0000000001                                   1
2           1           0000000001.0000000002                        2
3           1           0000000001.0000000003                        2
4           1           0000000001.0000000004                        2
5           2           0000000001.0000000002.0000000005             3
6           2           0000000001.0000000002.0000000006             3
7           3           0000000001.0000000003.0000000007             3
8           3           0000000001.0000000003.0000000008             3
9           4           0000000001.0000000004.0000000009             3
10          9           0000000001.0000000004.0000000009.0000000010  4

*/ 


Вот после и сортировать можно.

С уважением,
Александр Степанов
...
Рейтинг: 0 / 0
15.10.2002, 14:55:01
    #32058402
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
To Luchkin Dmitry
Вариант с жесткими ограничениями по вложенности уровней мне не нравиться, так как пытаюсь писать универсальную систему и все возможно что в будущих версиях количество уровней будет увеличено :) Но все равно спасибо за идею

To Александр Степанов
Вот что то такоя мне и мерещилось в моих раздумьях, на эту тему перед тем как я обратился сюда с вопросом, спасибо вам что прояснили мои мысли. Именно так и сделаю. Вдруг чего не получится будут взывать о помощи поновой :).
...
Рейтинг: 0 / 0
15.10.2002, 14:55:13
    #32058403
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
> Помогиет сделать это _ быстро _

Храни полный путь до записи в дереве в качестве атрибута этой записи, а не вычисляй его при обращении. Тогда это будет быстро. Вычисление пути должно производиться при помещении записи в дерево - один раз. А потом только использоваться. Да, под хранение путей придется потратить дополнительное место в БД. Но - одно из двух. Либо скорость, либо размер БД.
...
Рейтинг: 0 / 0
15.10.2002, 15:09:23
    #32058414
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Однако, размерчик окажется ещё тот...
Я для себя когда это решал, посчитал, что такая полная сортировка потребуется только в отчётах, а там уже и подождёт пользователь, ничего с ним не случится.
Поэтому сделал SP, которая перегоняет мне из обычного справочника во временный, в котором не одно поле для сортировки, а столько, сколько уровней. Что-то вроде
[GrpTop] [int], [GrpTop-1] [int], ... [Grp1] [int], [ID] [int], [Name] [varchar].
При этом структура генерится "на лету", в зависимости от реальной вложенности.
...
Рейтинг: 0 / 0
15.10.2002, 15:20:12
    #32058421
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
To Garya
Ну вопервых приоткрою завесу над своей задачей :)
Я оптимизирую работу самописной конфигурации 1С, в которой есть справочник с иерархической структурой "Справочник.Товаров" и есть остатки которые необходимо сортировать в соответствии с иерархией. Так что изменять структуру базы и создавать в ней тригера, а это видимо самый удобный способ вычисления полного кода, мне не хочется, хотя это возможно (правда тригера в 1с-ной базе еще не пробовал).
To Luchkin Dmitry
Т.е. изначально нужно пробежаться по базе и вычислить максимальное количество уровней а потом создать временную таблицу с таким же количеством полей для сортировки?
...
Рейтинг: 0 / 0
15.10.2002, 15:34:49
    #32058431
Nickolay
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Хотелось бы что нибудь вроде
UPDATE Talble1 SET Full_id = Get_full_ID(T_id)

а так нельзя?
Код: plaintext
1.
2.
DECLARE @full_id int
EXEC @full_id = Get_full_ID T_id
UPDATE Talble1 SET Full_id = @full_id
,или
Код: plaintext
1.
2.
DECLARE @full_id varchar ( 100 )
EXEC Get_full_ID T_id , @full_id OUTPUT
UPDATE Talble1 SET Full_id = @full_id

ксожалению в 1С не силен, так что другого ничего предложить не могу.
...
Рейтинг: 0 / 0
15.10.2002, 15:35:43
    #32058433
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
у каждого элемента справочника есть ID, ParentID и Lev. Последний вычисляется как раз при изменении средства. Во всяком случае, если при 10 уровнях, да 10 char на уровень, да 10'000 хотябы позиций, -- уже скока... Уже до фига получается зря почти в базе лежит. а ещё индекс по нему наверняка...
Впрочем, что кому нравится...
...
Рейтинг: 0 / 0
15.10.2002, 16:03:14
    #32058458
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
TO Nickolay
Так нельзя мне не нужно одним значением заполнить всю таблицу, мне нужно присвоит каждому элементу свой полный код, а твой вариант предлагает одно значени записать всем подряд.
TO Luchkin Dmitry
Не понял о чем ты.... разясни подробнее.
...
Рейтинг: 0 / 0
15.10.2002, 16:40:23
    #32058481
Luchkin Dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Я о том, что поле для полной сортировки, как предлагается, будет занимать... большой объём. А у меня хранится только уровень вложенности (int). Поэтому максимальный уровень вложенности получается select @MaxLev= MAX(Lev) from dict. исходя из этого и формируется строка с запросом на формирование справочника для отчёта типа такой:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 -- Создание нормализованного справочника
 
select t1.ID as Grp1, t1.ID as Grp2, t1.ID as Grp3, t1.ID, t1.Lev, t1.Name
from Dict t1 where t.Lev =  0 

union

select t1.ParentID as Grp1, t1.ID as Grp2, t1.ID as Grp3, t1.ID, t1.Lev, space(t1.Lev* 2 ) + t1.Name as Name 
from Dict t where t.Lev =  1 

union

select t2.ParentID as Grp1, t1.ParentID as Grp2, t1.ID as Grp3, t1.ID, t1.Lev, space(t1.Lev* 2 ) +t1.Name as Name 
from Dict t1
   LEFT JOIN Dict t2 ON (t1.ParentID = t2.ID)
   where t1.Lev =  2 

union

select t3.ParentID as Grp1, t2.ParentID as Grp2, t1.ParentID as Grp3, t1.ID, t1.Lev, space(t1.Lev* 2 )+t1.Name as Name 
from Dict t1
   LEFT JOIN Dict t2 ON (t1.ParentID = t2.ID)
   LEFT JOIN Dict t3 ON (t2.ParentID = t3.ID)
   where t1.Lev =  3 

order by  1 ,  2 ,  3 ,  4 
...
Рейтинг: 0 / 0
15.10.2002, 17:09:00
    #32058494
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Ну так я ж не храню это в базе, я строю временную таблицу в которую добавляю поле которое и заполняю впоследствии полными кодами :).

Авот совет Александр Степанов мне не подошел. Потому как у меня есть временная таблица в которой только частичная выборка товара из справочника товаров.

Т.е. в моей выборке нет всей ветки от корня и до последнего вложения. Вся ветка находится в отдельной таблице с которой моя временная связаны по идентификатору товара. И заполнять полныи кодами мне необходимо не таблицу справочника а мою временную.

А рассматривать вариант в котором сначала создается указаным образом временная таблица со всеми полными кодами справочника, а потом присоединять ее к моей выборке, не будем ибо как громоздко это очень
...
Рейтинг: 0 / 0
15.10.2002, 19:21:28
    #32058553
Александр Степанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Тогда должен подойти этот вариант, он расчитает пути только для нужных ID:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
create table goods
(
	id int identity( 1 , 1 ) not null primary key clustered,
	parentid int null
)
go

alter table goods add constraint FK_goodsPARENTID_goodsID foreign key(parentid) references goods(id)
create index IX_goods_PARENTID on goods(parentid)
go

insert into goods(parentid) values(null)
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 1 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 2 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 3 )
insert into goods(parentid) values( 4 )
insert into goods(parentid) values( 9 )
go

 /*
Создание временной таблицы со списком
ID, для которых нужно получить пути.
Будет использована в хранимой процедуре
*/ 
create table #neededIDs
(
	id int not null
)

insert into #neededIDs values( 7 )
insert into #neededIDs values( 9 )
GO

create procedure getFullPath
As
create table #tmp
(
	id int not null,
	parentid int null,
	path varchar( 7500 ) not null
)

insert into #tmp
Select
	g.*,
	RIGHT('000000000'+cast(g.id As varchar( 10 )), 10 )
From
	goods g
	inner join #neededIDs n
		on n.id=g.id

while @@rowcount> 0 
BEGIN
	Update t
	Set
		parentid=g.parentid,
		path=RIGHT('000000000'+cast(g.id As varchar( 10 )), 10 )+'.'+t.path
	From
		#tmp t
		inner join goods g
		on t.parentid=g.id
END

Select id,path from #tmp 
GO

exec getFullPAth
GO

drop procedure getFullPath
go
drop table goods
drop table #neededIDs
go
 /*
Результат:
id          path                                         
----------- -------------------------------------------- 
7           0000000001.0000000003.0000000007             
9           0000000001.0000000004.0000000009             
*/ 

С уважением,
Александр Степанов
...
Рейтинг: 0 / 0
16.10.2002, 10:01:25
    #32058639
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Я тут в своё время писал, может подойдёт
...
Рейтинг: 0 / 0
16.10.2002, 11:05:03
    #32058666
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
To Александр Степанов

Я вообщем то как раз и подумывал вместо @Level использовать значение ParentId для заполнения временной таблицы полными кодами. Вы подтвердили мои подумывания. Спасибо за помощь.
...
Рейтинг: 0 / 0
16.10.2002, 11:54:58
    #32058695
mvg_first
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0)
Все получилось!!!!!

Единственное что пришлось изменить так это вместо первого Инсерта использовал Апдейт. Так как у меня уже была построенная выборка котрую необходимо заполнить товарами. Ускорение по сравнению с методом который использовал курсор и вызов хранимой процедуры просто бешенное :) Еще раз большое спасибо за помощь!!!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите заполнить таблицу значениями возвращаемыми ис ХП (T-SQL 7.0) / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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