powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Рекурсивный CTE
11 сообщений из 11, страница 1 из 1
Рекурсивный CTE
    #38923730
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый вечер
Помогите пожалуйста с рекурсивным CTE.
Есть таблица с классификаторами,в ней два поля которые интересны - id_classif - номер классификатора и parent_id - его родительский классификатор. Вложимость может быть любой. Мне нужно вытащить все id_classif всех классификаторов ниже определенного классификатора.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
select articul , classif ,name
from CARDSCLA
where CLASSIF in (with recursive ID_CLASSIF_CARDSCLA as (select ID_CLASSIF, NAME_CLASSIF
                                                         from CLASSIF
                                                         where PARENT_CLASSIF = 18809)

select ID_CLASSIF, NAME_CLASSIF
from ID_CLASSIF_CARDSCLA
union
select ID_CLASSIF, NAME_CLASSIF
from CLASSIF
where PARENT_CLASSIF in (select ID_CLASSIF
                         from CLASSIF
                         where PARENT_CLASSIF = 18809))

Запрос явно не отрабатывает все вложимости.
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38923745
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

ужас. Можешь DDL таблиц привести. Ты точно уверен что нужен именно UNION, а не UNION ALL. Наличие предиката IN несколько напрягает
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38923767
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что типа такого

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
WITH RECURSIVE ID_CLASSIF_CARDSCLA
AS (SELECT
        ID_CLASSIF,
        PARENT_CLASSIF,
        NAME_CLASSIF
    FROM
        CLASSIF
    WHERE PARENT_CLASSIF = 18809
    UNION ALL
    SELECT
        CLASSIF.ID_CLASSIF,
        CLASSIF.PARENT_CLASSIF,
        CLASSIF.NAME_CLASSIF
    FROM
        ID_CLASSIF_CARDSCLA
        JOIN CLASSIF ON ID_CLASSIF_CARDSCLA.ID_CLASSIF = CLASSIF.PARENT_CLASSIF)
SELECT
    *
FROM
    ID_CLASSIF_CARDSCLA  
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38923869
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

нет слова "вложимость". есть вложенность.
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38923942
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvGallemar,

нет слова "вложимость". есть вложенность.
Учту в дальнейшем.
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38923943
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

с запросом то разобрался?
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38923944
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,


CREATE TABLE CARDSCLA (
ARTICUL T_ARTICUL COLLATE PXW_CYRL /* T_ARTICUL = VARCHAR(30) NOT NULL */,
CLASSIF INTEGER NOT NULL,
CARDTYPE T_CARD_TYPE /* T_CARD_TYPE = INTEGER NOT NULL */,
NAME T_FULL_NAME COLLATE PXW_CYRL /* T_FULL_NAME = VARCHAR(80) NOT NULL */,
MESURIMENT T_MESURIMENT /* T_MESURIMENT = INTEGER NOT NULL */,
COUNTRY T_COUNTRY /* T_COUNTRY = INTEGER */,
COMMENT T_COMMENT /* T_COMMENT = VARCHAR(255) */,
CLIENT_INDEX T_CLIENT_INDEX /* T_CLIENT_INDEX = INTEGER */,
PLACE_INDEX T_CLIENT_INDEX /* T_CLIENT_INDEX = INTEGER */,
MANUFACTURER T_MANUFACTURER /* T_MANUFACTURER = INTEGER */,
TRADE_MARK T_TRADE_MARK /* T_TRADE_MARK = INTEGER */,
ADD_PARAM1 T_ADD_PARAM /* T_ADD_PARAM = VARCHAR(80) */,
ADD_PARAM2 T_ADD_PARAM /* T_ADD_PARAM = VARCHAR(80) */,
ADD_PARAM3 T_ADD_PARAM /* T_ADD_PARAM = VARCHAR(80) */,
ADD_PARAM4 T_ADD_PARAM /* T_ADD_PARAM = VARCHAR(80) */,
ADD_PARAM5 T_ADD_PARAM /* T_ADD_PARAM = VARCHAR(80) */,
IS_ACCEPT T_BOOLEAN /* T_BOOLEAN = CHAR(1) DEFAULT 'F' NOT NULL CHECK (value in ('F','T')) */,
IS_USED T_BOOLEAN /* T_BOOLEAN = CHAR(1) DEFAULT 'F' NOT NULL CHECK (value in ('F','T')) */,
IS_COMPLECT T_BOOLEAN /* T_BOOLEAN = CHAR(1) DEFAULT 'F' NOT NULL CHECK (value in ('F','T')) */,
IS_ASSORTIMENT T_BOOLEAN /* T_BOOLEAN = CHAR(1) DEFAULT 'F' NOT NULL CHECK (value in ('F','T')) */,
CARD_KIND T_CARD_KIND /* T_CARD_KIND = CHAR(1) NOT NULL CHECK (value in ('N', 'S', 'W')) */,
SCALE_TYPE T_SCALE_TYPE /* T_SCALE_TYPE = INTEGER */,
MODDATE T_DATE NOT NULL /* T_DATE = DATE NOT NULL */,
MODMANAGER T_CODES NOT NULL /* T_CODES = INTEGER NOT NULL */,
BARCODE_COUNT T_COUNT /* T_COUNT = INTEGER DEFAULT 0 NOT NULL */,
PACK_COUNT T_COUNT /* T_COUNT = INTEGER DEFAULT 0 NOT NULL */,
INSDATE T_DATE_NULL /* T_DATE_NULL = DATE */,
MANAGER T_FID /* T_FID = INTEGER */,
LOGISTIC T_FID /* T_FID = INTEGER */,
GR T_GR /* T_GR = VARCHAR(5) */,
SECTION T_FID /* T_FID = INTEGER */,
SERTIF T_STR_VALUE /* T_STR_VALUE = VARCHAR(255) */,
BARCODE T_BARCODE_NULL /* T_BARCODE_NULL = VARCHAR(30) */,
BRUTTO T_QUANTITY /* T_QUANTITY = DOUBLE PRECISION DEFAULT 0 NOT NULL */,
NETTO T_QUANTITY /* T_QUANTITY = DOUBLE PRECISION DEFAULT 0 NOT NULL */,
WASTERATE T_PERCENT /* T_PERCENT = DOUBLE PRECISION DEFAULT 0 NOT NULL */,
SHORTNAME T_NAME_NULL /* T_NAME_NULL = VARCHAR(40) */,
KRIT_OST T_QUANTITY /* T_QUANTITY = DOUBLE PRECISION DEFAULT 0 NOT NULL */,
KATMANAGER T_FID /* T_FID = INTEGER */,
TOVAR T_FID /* T_FID = INTEGER */,
RZSCALE T_FID /* T_FID = INTEGER */,
MATERIAL T_FID /* T_FID = INTEGER */,
COLOR T_FID /* T_FID = INTEGER */,
PRMODEL T_CUSTOM /* T_CUSTOM = VARCHAR(30) */,
PRCOLOR T_CUSTOM /* T_CUSTOM = VARCHAR(30) */,
PRMATER T_CUSTOM /* T_CUSTOM = VARCHAR(30) */,
PRDELIM T_STR_VALUE NOT NULL COLLATE PXW_CYRL /* T_STR_VALUE = VARCHAR(255) */,
PRVIEW T_ID /* T_ID = INTEGER NOT NULL */,
PRARTICUL T_STR_VALUE COLLATE PXW_CYRL /* T_STR_VALUE = VARCHAR(255) */,
SROKGODN T_QUANTITY /* T_QUANTITY = DOUBLE PRECISION DEFAULT 0 NOT NULL */,
IS_CASHQUANT T_INT_BOOLEAN NOT NULL /* T_INT_BOOLEAN = SMALLINT DEFAULT 0 NOT NULL CHECK (value in (-1,0,1)) */,
XYZ T_GR /* T_GR = VARCHAR(5) */,
CUR_TYPE T_CUR_TYPE COLLATE PXW_CYRL /* T_CUR_TYPE = VARCHAR(6) */,
VOLUME T_QUANTITY NOT NULL /* T_QUANTITY = DOUBLE PRECISION DEFAULT 0 NOT NULL */,
GENDER T_ID DEFAULT 0 /* T_ID = INTEGER NOT NULL */,
ANALOG_KIND T_ID default 0 /* T_ID = INTEGER NOT NULL */,
IS_CASHPRICE T_INT_BOOLEAN /* T_INT_BOOLEAN = SMALLINT DEFAULT 0 NOT NULL CHECK (value in (-1,0,1)) */
);

CREATE TABLE CLASSIF (
ID_CLASSIF T_CLASSIF /* T_CLASSIF = INTEGER NOT NULL */,
PARENT_CLASSIF T_CLASSIF /* T_CLASSIF = INTEGER NOT NULL */,
NAME_CLASSIF T_NAME /* T_NAME = VARCHAR(40) NOT NULL */,
TYPE_CLASSIF T_CLASSIF_TYPE /* T_CLASSIF_TYPE = INTEGER NOT NULL */,
LINK_CLASSIF INTEGER,
ITEMCOUNT T_COUNT /* T_COUNT = INTEGER DEFAULT 0 NOT NULL */
);



/******************************************************************************/
/*** Primary keys ***/
/******************************************************************************/

ALTER TABLE CARDSCLA ADD CONSTRAINT PK_CARDSCLA PRIMARY KEY (ARTICUL);
ALTER TABLE CLASSIF ADD CONSTRAINT PK_CLASSIF PRIMARY KEY (ID_CLASSIF);


/******************************************************************************/
/*** Foreign keys ***/
/******************************************************************************/

ALTER TABLE CARDSCLA ADD CONSTRAINT FK_CARDSCLA_CLASSIF FOREIGN KEY (CLASSIF) REFERENCES CLASSIF (ID_CLASSIF) ON DELETE CASCADE;
ALTER TABLE CLASSIF ADD CONSTRAINT FK_CLASSIFS_CLASSIF_TYPE FOREIGN KEY (TYPE_CLASSIF) REFERENCES CLASSIF_TYPE (ID_CLASSIF_TYPE) ON DELETE NO ACTION ON UPDATE CASCADE;


/******************************************************************************/
/*** Indices ***/
/******************************************************************************/

CREATE INDEX CARDSCLANAMEINDEX ON CARDSCLA (NAME);
CREATE INDEX CARDSCLA_IDX_ANALOG ON CARDSCLA (ANALOG_KIND);
CREATE INDEX CLASSIF_PARENT ON CLASSIF (PARENT_CLASSIF);
CREATE INDEX CLASSIF_PARENT_CLASSIF ON CLASSIF (PARENT_CLASSIF);
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38923980
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

если я правильно понял, то что ты хочешь, то должно бы так


Код: 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.
WITH RECURSIVE ID_CLASSIF_CARDSCLA
AS (
   /* не рекурсивная часть запроса вытаскиваем всех детей 18809 */
   SELECT
        ID_CLASSIF,
        PARENT_CLASSIF,
        NAME_CLASSIF
    FROM
        CLASSIF
    WHERE PARENT_CLASSIF = 18809
    UNION ALL
    /* Рекурсивная часть. Смотрим кто из детей родитель и вытаскиваем их детей */
    SELECT
        CLASSIF.ID_CLASSIF,
        CLASSIF.PARENT_CLASSIF,
        CLASSIF.NAME_CLASSIF
    FROM
        ID_CLASSIF_CARDSCLA
        JOIN CLASSIF ON CLASSIF.PARENT_CLASSIF = ID_CLASSIF_CARDSCLA.ID_CLASSIF)
/* По полученным ID_CLASSIF вытаскиваем те что есть в CARDSCLA */
SELECT
    CARDSCLA.ARTICUL AS ARTICUL,
    CARDSCLA.CLASSIF AS CLASSIF,
    CARDSCLA.NAME AS NAME
FROM
    ID_CLASSIF_CARDSCLA
    JOIN CARDSCLA ON CARDSCLA.CLASSIF = ID_CLASSIF_CARDSCLA.ID_CLASSIF 
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38924050
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,супер,большое спасибо
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38925930
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarВложимость может быть любой.
Если действительно любой, то CTE тебе не поможет.
Либо классическая рекурсия, либо обходи циклами.
...
Рейтинг: 0 / 0
Рекурсивный CTE
    #38925945
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

ну 1023 уровня вложенности надо ещё постараться сделать. Да и рекурсия через процедуры тоже ограничена.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Рекурсивный CTE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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