(sql) Сортировка элементов

Приветствую Нужна помощь! Создаю и заполняю таблицу данными запросами. Заранее Спасибо!!

CREATE TABLE test_table (
      id INT,
      ParentId INT,
      Name VARCHAR(256)
    );

INSERT INTO test_table VALUES (1, 0, 'debian');
INSERT INTO test_table VALUES (2, 1, 'ubuntu');
INSERT INTO test_table VALUES (3, 2, 'kubuntu');
INSERT INTO test_table VALUES (4, 2, 'lubuntu');
INSERT INTO test_table VALUES (5, 2, 'linux mint');
INSERT INTO test_table VALUES (6, 0, 'slackware');
INSERT INTO test_table VALUES (7, 6, 'slax');
INSERT INTO test_table VALUES (8, 7, 'wolvix');
INSERT INTO test_table VALUES (9, 7, 'slampp');
INSERT INTO test_table VALUES (10, 7, 'dnalinux');
INSERT INTO test_table VALUES (11, 6, 'suse');
INSERT INTO test_table VALUES (12, 11, 'linkat');
INSERT INTO test_table VALUES (13, 11, 'opensuse');
INSERT INTO test_table VALUES (14, 0, 'redhate');
INSERT INTO test_table VALUES (15, 14, 'fedora core');
INSERT INTO test_table VALUES (16, 15, 'sailfish os');
INSERT INTO test_table VALUES (17, 15, 'fedora');

Вывод мне нужен в таком виде:

slackware
   slax
      slampp
      dnalinux
   suse
      linkat
redhat
   fedora core
      sailfish os
      fedora

Пытаюсь сделать запросом :

SELECT lpad(' ', 3*level)||name as TreeTable
FROM test_table
WHERE name LIKE '%a%'
START WITH ParentID = 0
CONNECT BY PRIOR id = ParentID
ORDER SIBLINGS BY ParentId;

Получается вывод:

debian
   slackware
      slax
         slampp
         dnalinux
         linkat
   redhate
      fedora core
         sailfish os
         fedora

Ответы (1 шт):

Автор решения: Mike
SELECT lpad(' ', 3*level)||name as TreeTable
  FROM (
    SELECT distinct *
      FROM test_table t
     START WITH name LIKE '%a%'
       and not exists(select 1 from test_table x where x.parentId = t.id)
   CONNECT BY id = PRIOR ParentID
  ) x
   START WITH ParentID = 0
 CONNECT BY PRIOR id = ParentID
 ORDER SIBLINGS BY ParentId;

Внутренний подзапрос находит все листья дерева, удовлетворяющие условию и их родителей. Внешний запрос строит из них дерево, начиная с корневого элемента. Если требуется искать так же промежуточные элементы, удовлетворяющие условию like, то надо убрать проверку not exists.

Пример на sqlfiddle.com

→ Ссылка