Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Count в рекурсивном запросе / 9 сообщений из 9, страница 1 из 1
29.05.2017, 10:43
    #39461315
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Есть древовидная табля
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
CREATE TABLE RDB$DOCSETTINGS (
    ID                    INTEGER NOT NULL,
    PARENT_ID             INTEGER,
    NAME                  DMN_STRING_500,
    HAS_CHILDREN          INTEGER DEFAULT 0,
    IS_NODE               DMN_BOOL_2 DEFAULT 0,
    NOTE                  DMN_BLOBTXT,
    TYPE_STRING           DMN_STRING_500,
    TYPE_INTEGER          INTEGER,
    TYPE_BOOLEAN          DMN_BOOL_3,
    TYPE_DATETIME         DMN_DATETIME,
    TYPE_TXTBLOB          DMN_BLOBTXT,
    TYPE_BINBLOB          DMN_BLOBIMG,
    KIND_ACTION           DMN_KIND_ACTION,
    INS_UPD_DEL_USER      DMN_STRING_100 NOT NULL,
    INS_UPD_DEL_ROLE      DMN_STRING_100 NOT NULL,
    INS_UPD_DEL_DATETIME  DMN_DATETIME,
    DELETED_REC           DMN_BOOL_2,
    UUID                  DMN_UUID
);

ALTER TABLE RDB$DOCSETTINGS ADD CONSTRAINT PK_RDB$DOCSETTINGS PRIMARY KEY (ID);
ALTER TABLE RDB$DOCSETTINGS ADD CONSTRAINT FK_RDB$DOCSETTINGS FOREIGN KEY (PARENT_ID) REFERENCES RDB$DOCSETTINGS (ID) ON DELETE CASCADE ON UPDATE CASCADE;


Получаю родителя со всеми потомками
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
WITH RECURSIVE TREE (ID,
       PARENT_ID,
       NAME,
       HAS_CHILDREN,
       IS_NODE,
       NOTE,
       TYPE_STRING,
       TYPE_INTEGER,
       TYPE_BOOLEAN,
       TYPE_DATETIME,
       TYPE_TXTBLOB,
       TYPE_BINBLOB)
AS (SELECT ID,
       PARENT_ID,
       NAME,
       HAS_CHILDREN,
       IS_NODE,
       NOTE,
       TYPE_STRING,
       TYPE_INTEGER,
       TYPE_BOOLEAN,
       TYPE_DATETIME,
       TYPE_TXTBLOB,
       TYPE_BINBLOB
    FROM RDB$DOCSETTINGS
    WHERE (UPPER(NAME) = UPPER(:prmName))
    UNION ALL
    SELECT D.ID,
       D.PARENT_ID,
       D.NAME,
       D.HAS_CHILDREN,
       D.IS_NODE,
       D.NOTE,
       D.TYPE_STRING,
       D.TYPE_INTEGER,
       D.TYPE_BOOLEAN,
       D.TYPE_DATETIME,
       D.TYPE_TXTBLOB,
       D.TYPE_BINBLOB
    FROM RDB$DOCSETTINGS D
    INNER JOIN TREE T ON T.ID = D.PARENT_ID
    WHERE (D.PARENT_ID IS NOT NULL))
SELECT *
FROM TREE


Как можно в этот же запрос воткнуть подсчет кол-ва полученных записей, никак не соображу?
=================
Док.

Win7 Ultim x64/Deb 8.7 i386:
FB 3.0.2.32703, диалект 3, SS(win)/SC(Deb),
Lazarus 1.9(r.55042); FPC 3.1.1 (r.36290), IBX by -Rik-; IBE 2017.4.19.2
...
Рейтинг: 0 / 0
29.05.2017, 10:55
    #39461328
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Док,

как-то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
WITH RECURSIVE TREE (ID,
       PARENT_ID,
       NAME,
       HAS_CHILDREN,
       IS_NODE,
       NOTE,
       TYPE_STRING,
       TYPE_INTEGER,
       TYPE_BOOLEAN,
       TYPE_DATETIME,
       TYPE_TXTBLOB,
       TYPE_BINBLOB)
AS (SELECT ID,
       PARENT_ID,
       NAME,
       HAS_CHILDREN,
       IS_NODE,
       NOTE,
       TYPE_STRING,
       TYPE_INTEGER,
       TYPE_BOOLEAN,
       TYPE_DATETIME,
       TYPE_TXTBLOB,
       TYPE_BINBLOB
    FROM RDB$DOCSETTINGS
    WHERE (UPPER(NAME) = UPPER(:prmName))
    UNION ALL
    SELECT D.ID,
       D.PARENT_ID,
       D.NAME,
       D.HAS_CHILDREN,
       D.IS_NODE,
       D.NOTE,
       D.TYPE_STRING,
       D.TYPE_INTEGER,
       D.TYPE_BOOLEAN,
       D.TYPE_DATETIME,
       D.TYPE_TXTBLOB,
       D.TYPE_BINBLOB
    FROM RDB$DOCSETTINGS D
    INNER JOIN TREE T ON T.ID = D.PARENT_ID
    WHERE (D.PARENT_ID IS NOT NULL))
SELECT
  COUNT(*) OVER() AS CNT, 
  TREE.*
FROM TREE

...
Рейтинг: 0 / 0
29.05.2017, 12:56
    #39461458
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
если ты деревья потом визуализируешь, то кол-во потомков лучше хранить в узле, а не считать каждый раз заново.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.05.2017, 13:25
    #39461499
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Симонов Денискак-то так
не взлетело :(
Код: sql
1.
2.
3.
4.
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the select list (not contained in either an aggregate function or the GROUP BY clause).


Мимопроходящийкол-во потомков лучше хранить в узле
там настройки юзера, мне тупо надо получить кол-во записей, чтобы указать размер массива для обработки при загрузке в потоке
...
Рейтинг: 0 / 0
29.05.2017, 13:26
    #39461503
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Докне взлетело :(
упсс.. ступил. Невнимательно код посмотрел. Спасибо
...
Рейтинг: 0 / 0
29.05.2017, 13:28
    #39461505
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Док,

а ты точно OVER() дописал? Я спецом как оконную функцию оформил.
И ещё какое именно количество надо общее или количество потомков на каждом узле?
...
Рейтинг: 0 / 0
29.05.2017, 13:30
    #39461511
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Докмне тупо надо получить кол-во записей, чтобы указать размер массива для
обработки при загрузке в потоке
И ради такой мелочи ты нагружаешь сервер дурными запросами? Используй динамические структуры.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
29.05.2017, 13:45
    #39461532
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Симонов ДенисИ ещё какое именно количество надо общее или количество потомков на каждом узле?
то, что надо. Одно, на весь корень
...
Рейтинг: 0 / 0
29.05.2017, 13:47
    #39461535
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Count в рекурсивном запросе
Dimitry SibiryakovИ ради такой мелочи
я не так выразился, остальные поля тоже нужны. Настройки я откуда буду грузить?
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Count в рекурсивном запросе / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]