Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Обход дерева  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 620
Есть дерево например
id parentid
1 null
1 2
2 3
2 4
3 5
10 null
10 11

Нужно получить все соответствия корень-листок - т.е.
1 2
1 3
1 4
1 5
10 11

Как?
14 янв 14, 16:42    [15414367]     Ответить | Цитировать Сообщить модератору
 Re: Обход дерева  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
https://www.sql.ru/forum/afsearch.aspx?s=??????&submit=?????&bid=1
14 янв 14, 17:21    [15414588]     Ответить | Цитировать Сообщить модератору
 Re: Обход дерева  [new]
мимокрокодил0001
Guest
virus_system,

добавить колонку _path и решить 95% задач с деревьями
14 янв 14, 17:40    [15414681]     Ответить | Цитировать Сообщить модератору
 Re: Обход дерева  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
мимокрокодил0001, а куда делся у вас HierarchyID ?
15 янв 14, 03:58    [15416335]     Ответить | Цитировать Сообщить модератору
 Re: Обход дерева  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 620
это все хорошо... 1 .но я так то сначала погуглил, а потом вопрос задавал.
2. Столбец path не подходит - не могу внести изменения в структуру БД.

3. Есть конкретные идеи?
15 янв 14, 08:09    [15416535]     Ответить | Цитировать Сообщить модератору
 Re: Обход дерева  [new]
Hooly-Gun
Member

Откуда:
Сообщений: 16
IF OBJECT_ID('tempdb..#tree', 'U') IS NOT NULL
    DROP TABLE #tree;

CREATE TABLE #tree
(
	oid     INT,
	parent  INT
)

INSERT INTO #tree
  (
    oid,
    parent
  )
SELECT 1,
       NULL
UNION ALL
SELECT 2,
       1
UNION ALL
SELECT 3,
       2
UNION ALL
SELECT 4,
       2
UNION ALL
SELECT 5,
       3
UNION ALL
SELECT 10,
       NULL
UNION ALL
SELECT 11,
       10

SELECT *
FROM   #tree;


    WITH  Dc(oid, parent, [root]) AS
(
    SELECT DISTINCT
           t1.oid,
           t1.parent,
           t1.oid [root]
    FROM   #tree t1
    WHERE  t1.parent IS NULL
    UNION ALL
    SELECT t2.oid,
           t2.parent,
           Dc.[root]
    FROM   #tree t2
           INNER JOIN Dc
                ON  Dc.oid = t2.parent
)
SELECT DISTINCT 
       Dc.[root],
       Dc.Oid
FROM   Dc
WHERE  DC.Oid != Dc.[root]
15 янв 14, 08:58    [15416662]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить