Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Получить корень любого узла / 10 сообщений из 10, страница 1 из 1
18.02.2017, 17:44
    #39407216
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
Есть дерево: ID, PARENT, NAME.
Как правильно получить корень любого узла?
Думаю, что можно использовать WITH RECURSIVE, но не понимаю, как.
...
Рейтинг: 0 / 0
18.02.2017, 18:16
    #39407224
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
X11,

в дереве только один корень
...
Рейтинг: 0 / 0
18.02.2017, 18:26
    #39407228
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
Хорошо, поставим вопрос по-другому.
Есть несколько корневых узлов, у которых parent равно нулю или NULL
...
Рейтинг: 0 / 0
18.02.2017, 18:32
    #39407230
чччД
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
X11,

выбираешь с помощшью сте всю ветку, результат сортируешь, добавляешь first 1.
...
Рейтинг: 0 / 0
18.02.2017, 18:34
    #39407233
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
Кучно пошли нечитатели доки и форума, то один, теперь второй... Ты ж вроде не новичок, насколько я помню.
В форуме точно были канонические примеры работы с деревом.
...
Рейтинг: 0 / 0
18.02.2017, 18:37
    #39407235
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
...
Рейтинг: 0 / 0
18.02.2017, 18:49
    #39407241
hvlad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
X11,

на рекурсивном шаге выбираешь родителя тек. узла, если тек. узел не "корень"
В самом селекте ставишь фильтр чтобы видеть только "корень"
...
Рейтинг: 0 / 0
18.02.2017, 19:41
    #39407268
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
спасибо всем
...
Рейтинг: 0 / 0
19.02.2017, 17:45
    #39407475
X11
X11
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
Правильно?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
WITH RECURSIVE CTE AS (
      SELECT R.ID,
             R.NAME,
             R.PARENT
        FROM REGIONS R WHERE ID = 1192

      UNION ALL

      SELECT R.ID,
             R.NAME,
             R.PARENT
        FROM REGIONS R
        INNER JOIN CTE ON CTE.PARENT = R.ID

    )
    SELECT FIRST 1 DISTINCT ID, NAME, PARENT
      FROM CTE ORDER BY ID



исходные данные


результат


тут ещё вот нарыл статью
http://www.sqlbooks.ru/printarticle.aspx?part=02&file=sql200509
...
Рейтинг: 0 / 0
19.02.2017, 20:08
    #39407500
m7m
m7m
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Получить корень любого узла
X11Правильно?

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
WITH RECURSIVE CTE AS (
      SELECT R.ID,
             R.NAME,
             R.PARENT
        FROM REGIONS R WHERE ID = 1192

      UNION ALL

      SELECT R.ID,
             R.NAME,
             R.PARENT
        FROM REGIONS R
        INNER JOIN CTE ON CTE.PARENT = R.ID

    )
    SELECT FIRST 1 DISTINCT ID, NAME, PARENT
      FROM CTE ORDER BY ID




я бы написал вот так
Код: sql
1.
2.
3.
    SELECT  ID, NAME, PARENT
      FROM CTE 
    WHERE COALESCE(PARENT,0) = 0  -- ибо "... у которых parent равно нулю или NULL "


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


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