Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Иерархические структуры [MSSQL]


Страницы:   1 2 3

Хаванагил ©   (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


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо