(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