powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Count в рекурсивном запросе
9 сообщений из 9, страница 1 из 1
Count в рекурсивном запросе
    #39461315
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть древовидная табля
Код: 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
Count в рекурсивном запросе
    #39461328
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

как-то так

Код: 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
Count в рекурсивном запросе
    #39461458
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если ты деревья потом визуализируешь, то кол-во потомков лучше хранить в узле, а не считать каждый раз заново.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Count в рекурсивном запросе
    #39461499
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денискак-то так
не взлетело :(
Код: 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
Count в рекурсивном запросе
    #39461503
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Докне взлетело :(
упсс.. ступил. Невнимательно код посмотрел. Спасибо
...
Рейтинг: 0 / 0
Count в рекурсивном запросе
    #39461505
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док,

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


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