Занимаюсь сейчас SQL Server 2005. Там появилась такая интересная возможность, как общие табличные выражения. По-видимому это из SQL-99. ОТВ немного похожи на представления, но они могут ссылать на себя, т.е. реализовать рекурсивный запрос произвольной глубины.
Некоторое время назад на форуме обсуждался вопрос хранения в одной таблице данных форума. Я тогда предложил таблицу приблизительно такого вида <id int, from_id int, text varchar(max)> (типы данных по sql server 2005). Здесь id – идентификатор записи, from_id – внешний ключ, text – сообщение форума. Для самого верхнего корневого уровня значение from_id = 0. Разумеется могут быть и другие столбцы. Таблица, т.о. ссылается на саму себя. На корневом уровне определяются темы или разделы форума. Каждая такая тема определяет одно дерево сообщений. При работе с деревьями могут возникнуть различные задачи. Скажем, типичной задачей является вывод всех сообщений, начиная с некоторого родительского сообщения (ветка дерева). Если глубина дерева неизвестна, то вывести сообщения обычными средствами достаточно сложно. Обычно идут по пути ограничения глубины. С появлением общих табличных выражений эта проблема решается элементарно. Одним из важнейших преимущества ОТВ по отношению к другим объектам является возможность ссылки внутри ОТВ на самую себя. В результате реализуется рекурсивный запрос, который в частности и решает поставленную выше задачу. declare @id int; set @id=3; --определяем ОТВ with cte (id,from_id,text) as ( select a.id,a.from_id,a.text from table1 a –структура храниться в таблице table1 where id=@id union all select a.id,a.from_id,a.text from table1 a inner join cte b –ссылка на саму себя on b.id=a.from_id ) select * from cte; В запросе выводятся все сообщения, для которых сообщение с идентификатором @id является родительским. |
Выложи SQl 2005 ![]() ![]() |
vladislav
Возможность интересная. Но получается, что для построения дерева всё равно используется рекурсия? |
Само дерево строиться просто путем ответа на какое-либо сообщение. Здесь нет никакой проблемы. |
Кроме рекурсии там, на сервере? |
Да какя там рекурсия. Просто команда insert:
insert into table1 (from_id,text) values (@id1,@mess) @id1 - идентификатор сообщения, нак которое ты отвечаешь @mess - само сообщение. А как там на сервере строки вставляются - нас не волнует. |
Не согласен. Рекурсия при достаточно большой вложенности остается рекурсией. |
XiroN
выкладывали уже. _________________ Скажи мне чей Крым, и я скажу кто ты. |
Leon писал(а): XiroN
выкладывали уже. Я не понял если выкладывали, ТО ГДЕ ОНО. И притом это было пол года назад. Или год вообще. |
XiroN писал(а): Leon писал(а): XiroN
выкладывали уже. Я не понял если выкладывали, ТО ГДЕ ОНО. И притом это было пол года назад. Или год вообще. а на этаж не спуститься и не взять да?? |
2Смерть: Ну тебя и плющит.... |
XiroN писал(а): 2Смерть: Ну тебя и плющит....хы.. а ты зади да и всё! ![]() ![]() Убей себя ! |
Успокоились оба ![]() _________________ Ин дер гросен фамилие нихт клювен клац-клац ![]() |
andy ice писал(а): Успокоились оба ![]() Окей босс!!! ![]() |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете вкладывать файлы Вы можете скачивать файлы |