powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Задача на рекурсивный запрос
6 сообщений из 6, страница 1 из 1
Задача на рекурсивный запрос
    #39010247
Asinkrit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,
скажу честно, сам опытный программист, но вот с этой задачей зашел в тупик, поэтому, решил ее разместить здесь.

Есть таблица организующая дерево (ID, ID_PARENT, NAME)
Нужно организовать фильтр по полю (NAME like :searsh_str), при том, в выборку должны попасть не только отфильтрованные записи, но и все их родители.

К примеру, исходные данные:
ID ID_PARENT NAME
1 null фрукт
2 null овощ
3 1 яблоко
4 2 морковь

нужно выбрать name like '%бло%' и получить результат:
ID ID_PARENT NAME
1 null фрукт
3 1 яблоко

уровней родственников может быть несколько, соответственно "select in select" не предлагать..
пробовал with recursive .., но как это обернуть, мне не догадаться..

Один вариант я придумал (добавить в таблицу поле level и отслеживать его), но он мне не нравится, кто-нибудь предложит какой-либо вариант решения данной задачи?

FireBird, Dialect 3
...
Рейтинг: 0 / 0
Задача на рекурсивный запрос
    #39010249
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asinkritпробовал with recursive .., но как это обернуть, мне не догадаться..

В последнем посте прикреплённой темы есть ссылка. Читал?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Задача на рекурсивный запрос
    #39010256
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asinkrit,

просто переверни рекурсию задом наперёд. типа такого

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
RECREATE TABLE MYTABLE (
 ID INT NOT NULL,
 ID_PARENT INT,
 NAME VARCHAR(35),
 CONSTRAINT PK_MYTABLE PRIMARY KEY (ID),
 CONSTRAINT FK_PARENT_MYTABLE FOREIGN KEY (ID_PARENT) REFERENCES MYTABLE(ID));

INSERT INTO MYTABLE(ID, ID_PARENT, NAME)
VALUES (1, null, 'фрукт');

INSERT INTO MYTABLE(ID, ID_PARENT, NAME)
VALUES (2, null, 'овощ');

INSERT INTO MYTABLE(ID, ID_PARENT, NAME)
VALUES (3, 1, 'яблоко');

INSERT INTO MYTABLE(ID, ID_PARENT, NAME)
VALUES (4, 2, 'морковь');

INSERT INTO MYTABLE(ID, ID_PARENT, NAME)
VALUES (5, 3, 'антоновка');

COMMIT;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
WITH RECURSIVE r
AS (SELECT
        id,
        id_parent,
        name
    FROM
        mytable
    where mytable.name containing 'антон'
    UNION ALL
    SELECT
        mytable.id,
        mytable.id_parent,
        mytable.name
    FROM
        r
        JOIN mytable ON r.id_parent = mytable.id)
SELECT
        id,
        id_parent,
        name
FROM
    r



получаем

Код: plaintext
1.
2.
3.
ID	ID_PARENT	NAME
5	3	        антоновка
3	1	        яблоко
1		        фрукт
...
Рейтинг: 0 / 0
Задача на рекурсивный запрос
    #39010540
Asinkrit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис, спасибо, работает, однако не все гладко, если я передаю пустое значение для фильтра, то дерево строится с дублирующими записями, с одной стороны в самом запросе можно заюзать distinct, но остается понимание, что при увеличении таблицы, возрастет нагрузка на сервер (это очень не желательно),
можно это как нибудь обойти?

На крайний случай, я конечно разделю логику, и буду юзать 2 разных запроса, с фильтром и без..
...
Рейтинг: 0 / 0
Задача на рекурсивный запрос
    #39010790
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Asinkritесли я передаю пустое значение для фильтра, то дерево строится с дублирующими записями
На самом деле у тебя всегда могу быть дубли, если не производить фильтрацию только по листовым элементам (не содержащим потомков).
Как эффективно решить задачу на сервере без distinct, я лично не знаю.
...
Рейтинг: 0 / 0
Задача на рекурсивный запрос
    #39010870
Asinkrit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Задача на рекурсивный запрос
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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