powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Деревья в MS SQL
5 сообщений из 5, страница 1 из 1
Деревья в MS SQL
    #32015130
User 1C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Структура справочника следующая:
ID - идентификатор строки
,ParentID - идентификатор родителя(группы)
,IsFolder - признак группы, т.е. есть подчиненные элементы
,descr и т.д.
уровень вложенности от 4 до 9
Есть потребность:
1. Выбрать элементы принадлежащие заданной группе?
2. Определить принадлежит ли заданный элемент заданной группе?
Структура таблиц изменению не подлежит (это справичник 1С)
Новые таблицы создавать можно.
...
Рейтинг: 0 / 0
Деревья в MS SQL
    #32015138
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где то тут уже про это говорилось...

2. Ну по паренту от элемента подняться и проверять, не совпадают ли ID каждого следующего уровня заданной группе

1. Просто список элементов, или деревом? Можно при помощи таблиц-переменных, хотя 1С под 7.5, тогда временных таблиц
...
Рейтинг: 0 / 0
Деревья в MS SQL
    #32015157
Slava
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. select * from YuorTable where id = Заданна_ группа
1.1 select * from YuorTable where parentid = ID_Заданной_группы
2. if exists(select * from YuorTable where id = Заданна_ группа) тогда Вам нужно учить SQL
Если Вам нужно проверять все уровни вложенности, то скажите. Напишу.
...
Рейтинг: 0 / 0
Деревья в MS SQL
    #32015172
Примерно так:

CREATE TABLE #Hierarchy
(
ID int NOT NULL PRIMARY KEY,
ParentID int NULL,
IsFolder int NOT NULL,
Descr nvarchar(100) NOT NULL
)

Insert Into #Hierarchy
VALUES(1,NULL,1,'Folder1')
Insert Into #Hierarchy
VALUES(2,NULL,1,'Folder2')
Insert Into #Hierarchy
VALUES(3,NULL,1,'Folder3')
Insert Into #Hierarchy
VALUES(4,NULL,1,'Folder4')

Insert Into #Hierarchy
VALUES(11,1,1,'Folder11')
Insert Into #Hierarchy
VALUES(12,1,1,'Folder12')
Insert Into #Hierarchy
VALUES(110,11,0,'Item110')
Insert Into #Hierarchy
VALUES(120,12,0,'Item120')

Insert Into #Hierarchy
VALUES(121,12,1,'Folder121')
Insert Into #Hierarchy
VALUES(1210,121,0,'Item1210')

/******************************************************************
Выбрать элементы, принадлежащие заданной группе.
ID Группы поместить в переменную @ID
Поместить туда NULL если требуется выбрать все элементы справочника
******************************************************************/

DECLARE @ID int
Set @ID=NULL

DECLARE @Level int
Set @Level=1

create table #tmp1(id int not null,[level] int not null, path nvarchar(3000) not null)
If @ID Is NULL
Insert Into #tmp1
Select
id,
@level,
descr
From
#Hierarchy
WHERE
ParentID Is NULL
ELSE
Insert Into #tmp1
Select
id,
@level,
descr
From
#Hierarchy
WHERE
ParentID=@ID

WHILE @@rowcount>0
BEGIN
Set @level=@level+1
Insert Into #tmp1
Select
h.id,
@level,
t.path+CHAR(0)+h.descr
From
#tmp1 t
inner join #Hierarchy h
on t.id=h.Parentid and t.[level]=@level-1
END

/*****************************************************
Вывод результатов в иерархическом виде
*****************************************************/
Select
t.id,
SPACE((t.[level]-1)*5)+h.Descr,
h.IsFolder
From
#tmp1 t
inner join #Hierarchy h
on t.id=h.id
Order By
t.path
drop table #tmp1

/**********************************************************
Определить, принадлежит ли заданный элемент @Item
заданной группе @Folder
**********************************************************/
DECLARE @Item int, @Folder int
Set @Item=120
Set @Folder=1

DECLARE @Folder1 int

Select @Folder1=ParentID from #Hierarchy where ID=@Item

WHILE @Folder1 Is Not NULL
BEGIN
If @Folder1=@Folder
BEGIN
Select @Item As Item,'содержится в папке',@Folder
BREAK
END
Select @Folder1=ParentID from #Hierarchy where ID=@Folder1
END

If @Folder1 Is NULL
Select @Item As Item,'не содержится в папке',@Folder

drop table #Hierarchy

С уважением,
Александр Степанов
...
Рейтинг: 0 / 0
Деревья в MS SQL
    #32015197
User 1C
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за совет "Изучите SQL"
И вот Что получилось:

DECLARE @level int
CREATE TABLE #stack (ID char(9), level1 int, descr char(180))
/*Insert #Stack select id , 1 , Descr from sc656 where ltrim(ParentId)='0' and IsFolder=1*/
Insert #Stack select id , 1 , Descr from sc656 where ltrim(Code)='1559'
Select @level = 2
WHILE @level < 10
BEGIN
Insert #Stack select n.ID, @Level , rtrim(St.Descr)+'\'+RTrim(n.Descr) from sc656 n, #Stack st
where n.parentID In (select s.ID from #stack s) and n.ID Not In (select s.ID from #stack s)
/*and n.IsFolder=1*/ and n.ParentId=st.Id
IF @@ROWCOUNT = 0 break
SELECT @level = @level + 1
END -- WHILE

select * from #Stack

/*select descr, sp4964 Dat from sc656 n where n.Parentid in (select s.id from #Stack s) and n.IsFolder=2
and sp4964 > '2001-09-01'
order by Descr, Dat desc*/
drop table #Stack
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Деревья в MS SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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