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

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

Запрос на SQL для выборки иерархического списка [MSSQL]


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

SuperChel ©   (2008-06-19 22:19:00) 

Приветствую Вас Мастера.
Есть простая таблица и для простоты пример: у таблицы два поля id и id_roditel в id храниться уникальное значение, а в id_roditel храниться ссылка на поле id. Как вы уже поняли это связный иерархический список. Хочу выбрать всю ветку потомков, указав какой то конкретный узел. Наведите на мысль как составить такой sql запрос.


stas   (2008-06-20 13:07:00) [21]

MsGuns ©   (20.06.08 12:57) [38]
Сколько пользователей юзает одновременно эти деревья?

stud ©   (20.06.08 12:40) [37]
нет.


MsGuns   (2008-06-20 12:57:00) [22]

Чет его знает, как ты умудряешься повесить сервер..
У меня разузлование выполняется на "деревянной" таблице с 5 млн.записей, причем вместо ид-ра используются нативные стринги, а кроме того еще из 5 разных таблиц берутся уточняющие данные (замены, техотход, позаказная расцеховка, наименования и прочий "интерьер"). "Дерево" из 30 000 узлов выгребается за 4 мин. Из 10 000 - за 30 сек. MS SQL 2000

Воистину рыба портится с головы ;)


stud   (2008-06-20 12:40:00) [23]


> при добавлении записи в основную таблицу срабатывает триггер,
>  который рекурсивно либо каким-то другим способом находит
> всех родителей только на вставленную запись, и заполняет
> другую таблицу.

так это получается для каждого узла своя таблица????
и если нужно получить на клиента только потомков начиная с текущего узла?
чето логика пользования такого варианта не совсем понятна.....


stas   (2008-06-20 12:08:00) [24]

аналагично :)


Ega23   (2008-06-20 12:06:00) [25]


> Ega23 ©   (20.06.08 12:01) [32]
> Ты ничего непонял...
>


Я понял всё прекрасно. И вообще, за последние 2.5 года 70% времени программирования серверной части уходило на работу с иерархическими структурами под MSSQL.
Так что не надо мне тут...  :)


stas   (2008-06-20 12:06:00) [26]

триггер+временная таблица такого нет!
есть триггер+постоянная таблица это 1 вариант
есть Multi statement function, которая по своей структуре подразумевает временную таблицу и возвращает ее результат это 2 -й вариант.


stas   (2008-06-20 12:03:00) [27]

Ega23 ©   (20.06.08 12:01) [32]
Ты ничего непонял...


Ega23   (2008-06-20 12:01:00) [28]

Я всё равно продолжаю не понимать, нафига нужен триггер и особенно - временная таблица?
Если есть такая таблица, которая изменяется крайне редко, но оттуда частые селекты идут - ну и заточи её под селекты изначально. Сделай какой-нибудь AbsoluteLevel и какой-нибудь ChildCount и AllChilsCount (тут можно подумать да в сети почитать).

А временная таблица в данной ситуации - это вообще жесть. В MSSQL их 2 типа - одни с # - на конкретный spid со временем жизни <= времени жизни spid. Второй тип - с двумя ## - в рамках сервера со временем жизни <= времени жизни самого сервера.
При разрыве соединения в первом случае и остановке (перезапуске) сервера во втором - ТАБЛИЦЫ БУДУТ ГРОХНУТЫ.

А в первом случае такая временная таблица будет создаваться для КАЖДОГО КЛИЕНТА.


stas   (2008-06-20 11:50:00) [29]

stud ©   (20.06.08 11:32) [29]
Напишу только про Insert
при добавлении записи в основную таблицу срабатывает триггер, который рекурсивно либо каким-то другим способом находит всех родителейтолько на вставленную запись, и заполняет другую таблицу. Таким образом у нас рекурсия работает, только на корректировку таблицы и только по тем записям которые связаны с редактируемой.
Это повшает производительность и не тянет много ресурсов при выборке, но снижает при корректировке таблицы.


Fin   (2008-06-20 11:48:00) [30]


> stud ©   (20.06.08 11:32) [29]
> > есть таблица,
>  в нее запросом добавляется запись с ид узла. далее срабатывает
> триггер на вставку, который ищет "детей" для добавленной
> записи, вставляет их в эту же таблицу, опять срабатывает
> (получается аналог рекурсии)


На сколько я понимаю триггер наложен на основную таблицу и перестраивает служебную в которой в упрошенном варианте тригерров нету.


stud   (2008-06-20 11:32:00) [31]


> Вы, извиняюсь, вообще представляете себе, для чего используются
> триггери и как они работают ?

очень смутно))
есть таблица, в нее запросом добавляется запись с ид узла. далее срабатывает триггер на вставку, который ищет "детей" для добавленной записи, вставляет их в эту же таблицу, опять срабатывает (получается аналог рекурсии) или пардон с триггерами есть другой вариант?


> Она станет копией результата отработки рекурсивной ХП

это в случае если данные из нее после получения удаляются.


stas   (2008-06-20 11:26:00) [32]

Правильный-Вася   (20.06.08 11:25) [27]

Читаем жирным
>таким образом при выборкеиспользуется
> таблица, без всяких функций и рекурсий.


Правильный-Вася   (2008-06-20 11:25:00) [33]


> наполняется триггерами, таким образом при выборке используется
> таблица, без всяких функций и рекурсий.

это и есть завуалированная рекурсия, если ты не догадался
только рекурсия наполнения, а не чтения


stas   (2008-06-20 11:21:00) [34]

MsGuns ©   (20.06.08 11:17) [24]
у вас есть простое решение?


stas   (2008-06-20 11:17:00) [35]

MsGuns ©   (20.06.08 11:15) [22]
У меня наоборот вешался, пока не перешли на таблицы.


MsGuns   (2008-06-20 11:17:00) [36]

>stas ©   (20.06.08 11:15) [23]
>в MSSQL в хранимках есть 1 минус, результат не так уж просто объеденить с другой >таблицей.

Сами придумали или кто вумный поделился "опытом" ?


stas   (2008-06-20 11:15:00) [37]

MsGuns ©   (20.06.08 11:11) [19]
в MSSQL в хранимках есть 1 минус, результат не так уж просто объеденить с другой таблицей.


MsGuns   (2008-06-20 11:15:00) [38]

>stud ©   (20.06.08 11:05) [15]
>ну тут наверное типа временная таблица с тими триггерами (есть такое в 2005?) и при >добавлении записи в нее триггер вытаскивает типа "детей", добавляет их в нее и

Вы, извиняюсь, вообще представляете себе, для чего используются триггери и как они работают ?

>получается в общем и целом бред,

вот это уже ближе к истине

>хотя работать будет

Угу, и подвесит нафиг сервер к чертовой матери.


Fin   (2008-06-20 11:14:00) [39]


> Ega23 ©   (20.06.08 10:30) [9]
> > Кстати вариант с триггером ИМХО очень перспективный вариант.
> От ситуации зависит. Может быть и перспективным. А может
> - и нет.

Согласен, но я не уточнил что относительно моих задач, где таблица пополняется крайне редко (единичные случаи в месяц), а вот выборка при расчете в основном и "загружает" сервак.


stas   (2008-06-20 11:12:00) [40]

она не станет копией справочника. Она станет копией результата отработки рекурсивной ХП


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

Наверх

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