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

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

посчитать сумму параметров дочерних эл-тов [D7, XP]


nachi ©   (2009-07-01 11:31:00) 

Удалено модератором
Примечание: СПАМ


nachi   (2009-07-01 13:08:00) [1]


> Вариант   (01.07.09 12:25) [1]

а вот про from не знал. Спасибо, ща с ним попробую переписать, что выше...


nachi   (2009-07-01 12:59:00) [2]

да-да, и триггер есть и ХП... не катит... долго.

а вообще, задача стоит следующая:
tree_table:
id, parent_id, par, uniq_par

text_to_tree:
tree_id, text_id

text_to_tree.tree_id - внешний ключ к tree_table
нужно пересчитывать параметры par и uniq_par следующим образом: каждый параметр par строки дерева равно количеству соответствующих строк в text_to_tree с учетом принадлежности всем дочерним темам. uniq_par - то же самое, только text_id должен быть уникальным в наборе.
Вроде внятно объяснил. Пока данных было мало, этих полей вообще не существовало - все делал запросом, но, с ростом табличек, пришлось от этого отказаться - слишком долго выполнялся запрос. Теперь, тормозит уже просто обновление. Делал так:

update content_tree
   set cnt =             (SELECT count(u_txt)
               FROM text_to_tree
              WHERE tree_id IN (
                               SELECT id
                                 FROM all_subj_child (id)
                               )),
     u_par =             (SELECT SUM(u_txt)
             FROM text_to_tree
            WHERE tree_id IN (
                               SELECT id
                                 FROM all_subj_child (id)
                               )),
     cnt_uniq =   (SELECT COUNT(DISTINCT(text_id))
              FROM text_to_tree
             WHERE tree_id IN (
                               SELECT id
                                 FROM all_subj_child (id)
                               )
           )   where id in (select id from all_subj_child(@id))

all_subj_child - функция, возвращающая всех детей ветви.

Как решить данную проблему? Приведенный код работает жутко медленно... строк - пока сотня тысяч, где-то...


Ega23   (2009-07-01 12:47:00) [3]

Тогда либо триггер, либо ХП (но обновлять тогда уже строго через неё).


Ega23   (2009-07-01 12:46:00) [4]

Погоди. Вот у меня таблица
1,null,0
2,1,0
3,1,0
4,2,0
5,2,0
6,3,0
7,3,0

при любом изменении par у меня должна запускаться рекурсивная обновлялка, которая смотрит, есть ли да данной записи дети. Если есть - обновить им par


nachi   (2009-07-01 12:45:00) [5]


> Ega23 ©   (01.07.09 12:42) [3]

не, значение par может быть любым числом...


nachi   (2009-07-01 12:42:00) [6]


> Или в запросе у тебя "tablе" в UPDATE и SELECT одна и та
> же таблица (имя_таблицы_обновления=имя_таблицы_выборки)?
>

ага


Ega23   (2009-07-01 12:42:00) [7]

Так это же Level получается. Только помноженный на коэффициент, нет?


Вариант   (2009-07-01 12:25:00) [8]

update  имя_таблицы_обновления
     set par = (select sum(par) from имя_таблицы_выборки  where parent_id =имя_таблицы_обновления.id)

Или в запросе у тебя "tablе" в UPDATE и SELECT одна и та же таблица (имя_таблицы_обновления=имя_таблицы_выборки)?


Наверх

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