![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Иерархические структуры [MSSQL]
Хаванагил © (2007-03-22 14:58:00)например, структура подразделений в организации..
организация, в ней отделы, в отделах - сектора и т.д.. как это хранить в базе?
если в виде записей, которые ссылаются на записи той же таблицы - можно, но тогда ссылка должна мочь быть null (для самого верхнего уровня, над которым уже ничего нет), но тогда каскадное удаление не получится (поправьте если всё же его можно устроить, у меня соответствующие опции в properties связи были не активные) и придется использовать рекурсию.. то же самое с введением таблицы связи (подразделение, вышестоящее подразделение)..
так вот...
есть ли способ чтобы без рекурсии обойтись?
Хаванагил (2007-03-22 16:40:00) [21]
> Jan (22.03.07 16:26) [21]
ооо....
Ega23 (2007-03-22 16:39:00) [22]
> и что за хитрый способ? =)
declare @Current_ID int
declare @TreeLevel int
declare @Stack table (Object_ID int null, TreeLevel int)
declare @Results table (Object_ID int null)
select @Current_ID = @Object_ID
select @TreeLevel = 1
insert into @Stack values (@Current_ID, @TreeLevel)
while @TreeLevel > 0 begin
if exists (select * from @Stack where TreeLevel = @TreeLevel) begin
select top 1 @Current_ID = Object_ID from @Stack where TreeLevel = @TreeLevel
insert into @Results (Object_ID) values (@Current_ID)
delete from @Stack where TreeLevel = @TreeLevel and Object_ID = @Current_ID
if @Type is not null
insert into @Stack
select Object_ID, @TreeLevel + 1
from Objects
where Parent_ID = @Current_ID
else
insert into @Stack
select Object_ID, @TreeLevel + 1
from Objects
where Parent_ID = @Current_ID
if @@rowcount > 0
select @TreeLevel = @TreeLevel + 1
end
else
select @TreeLevel = @TreeLevel - 1
end
delete from @Results where Object_ID = @Object_ID
Идею, вроде, sniknik как-то подкинул.
Jan (2007-03-22 16:26:00) [23]
> пардон, а что за UDF?
запускаем QA набираем create function и тынц Shift+F1
Хаванагил (2007-03-22 16:24:00) [24]так так...
пардон, а что за UDF?
> Ega23 © (22.03.07 16:13) [18]
и что за хитрый способ? =)
зы: я не очень в этом деле разбираюсь, так просто интересно стало)
триггеры мне понравилось.. может ими и сделать..
Jan (2007-03-22 16:23:00) [25]
> Как без рекурсии?
Мы ссылку читаем?
Извлечение узлов поддерева
Запрос, извлекающий все узлы поддерева, вершина которого имеет идентификатор P, будет выглядеть следующим образом:
SELECT t.*
FROM test4 t JOIN test4 t2
ON t.lb > t2.lb AND t.rb <= t2.rb
WHERE
t2.id = :P
Заменив строгое неравенство по левой границе на не строгое, мы добавим саму вершину поддерева в результирующую выборку.
Ega23 (2007-03-22 16:13:00) [26]
> Jan (22.03.07 16:01) [14]
>
>
> > В MSSQL нельзя из Select from Stored_Procedure сделать
>
> 1. UDF
> 2. обмануть:
>
> create table #temp (
> ...
> )
> insert into #temp
> exec sp_
>
> select * from #temp
>
Ну про это мы в курсе. А дальше что? Вот мне надо выбрать все данные от определённого узла. Глубина вложенности - неизвестно.
Как без рекурсии?
(способ-то один хитрый есть)
Val (2007-03-22 16:09:00) [27]лучше это...на рыбалочку...
Johnmen (2007-03-22 16:06:00) [28]
> ANB © (22.03.07 16:02) [15]
Да, я в курсе.
Но рекурсией она быть не перестанет. Кто бы её не крутил... :)
ANB (2007-03-22 16:02:00) [29]
> И всё равно это будет рекурсия. Просто неявная... :)
В оракле в твоем коде не будет. Оракл ее внутри сам прокрутит.
Jan (2007-03-22 16:01:00) [30]
> В MSSQL нельзя из Select from Stored_Procedure сделать
1. UDF
2. обмануть:
create table #temp (
...
)
insert into #temp
exec sp_
select * from #temp
Johnmen (2007-03-22 15:55:00) [31]И всё равно это будет рекурсия. Просто неявная... :)
Johnmen (2007-03-22 15:54:00) [32]Если делать триггер, то и ссылочные ключи с каскадным воздействием ни к чему.
Ega23 (2007-03-22 15:53:00) [33]
> не понял, что такого есть в ФБ чего нет в МССКЛ?
>
В MSSQL нельзя из Select from Stored_Procedure сделать
Jan (2007-03-22 15:50:00) [34]
> Ссылочные ключи таблицы на саму себя в MSSQL не пройдут.
> Что, в общем-то, понятно...
каскадные да, но кто мешает триггер сделать?
Ega23 (2007-03-22 15:50:00) [35]
> Ссылочные ключи таблицы на саму себя в MSSQL не пройдут.
Это почему? Пройдут.
Jan (2007-03-22 15:49:00) [36]
> Вопрос внимательно прочитал? Или надо объяснять разницу
> между MSSQL и FB?
не понял, что такого есть в ФБ чего нет в МССКЛ?
Johnmen (2007-03-22 15:49:00) [37]Ссылочные ключи таблицы на саму себя в MSSQL не пройдут. Что, в общем-то, понятно...
Ega23 (2007-03-22 15:46:00) [38]
> http://gsbelarus.com/gs/modules.php?name=News&file=article&sid=314#c4
Вопрос внимательно прочитал? Или надо объяснять разницу между MSSQL и FB?
Ega23 (2007-03-22 15:44:00) [39]
> есть :)
Нет.
Jan (2007-03-22 15:43:00) [40]http://gsbelarus.com/gs/modules.php?name=News&file=article&sid=314#c4