Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Рекурсивный CTE / 11 сообщений из 11, страница 1 из 1
01.04.2015, 12:54
    #38923730
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный CTE
Добрый вечер
Помогите пожалуйста с рекурсивным 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
01.04.2015, 13:06
    #38923745
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный CTE
Gallemar,

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

Код: 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
01.04.2015, 14:35
    #38923869
kdv
kdv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный CTE
Gallemar,

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

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

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


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
01.04.2015, 15:42
    #38923980
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный CTE
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
01.04.2015, 16:25
    #38924050
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный CTE
Симонов Денис,супер,большое спасибо
...
Рейтинг: 0 / 0
03.04.2015, 10:13
    #38925930
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный CTE
GallemarВложимость может быть любой.
Если действительно любой, то CTE тебе не поможет.
Либо классическая рекурсия, либо обходи циклами.
...
Рейтинг: 0 / 0
03.04.2015, 10:20
    #38925945
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Рекурсивный CTE
WildSery,

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


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