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

Откуда: Россия
Сообщений: 453
Здравствуйте коллеги!
Не могу осилить, как оказалось сложное задание для меня... Требуется "прорядить" дерево, не показывать пустые ветви, где нет ссылающихся данных из другой таблицы. Прошу помочь... Исходные данные двух таблиц изобразил.


//1. Есть древо товаров :

DECLARE @tovar TABLE (id int, parentid int, v nvarchar(15))
INSERT INTO @tovar VALUES (1, 0, 'Корень')
INSERT INTO @tovar VALUES (2, 1, 'Фрукты')
INSERT INTO @tovar VALUES (3, 1, 'Овощи')
INSERT INTO @tovar VALUES (4, 1, 'Конфеты')
INSERT INTO @tovar VALUES (5, 3, 'Картофель')
INSERT INTO @tovar VALUES (6, 3, 'Морковь')
INSERT INTO @tovar VALUES (7, 3, 'Капуста')
INSERT INTO @tovar VALUES (8, 4, 'Шоколадные')
INSERT INTO @tovar VALUES (9, 4, 'Карамель')
INSERT INTO @tovar VALUES (10, 2, 'Яблоки')
INSERT INTO @tovar VALUES (11, 2, 'Груша')
INSERT INTO @tovar VALUES (12, 2, 'Мандарины')
INSERT INTO @tovar VALUES (13, 2, 'Апельсины')
INSERT INTO @tovar VALUES (14, 2, 'Бананы')
INSERT INTO @tovar VALUES (15, 2, 'Киви')

//2. Есть таблица с количеством товара

DECLARE @sklad TABLE (idtovar int, kolvo int)
INSERT INTO @sklad VALUES (14, 1500)
INSERT INTO @sklad VALUES (15, 2500)

//3. Вывод данных

SELECT * FROM @tovar ORDER BY parentid, v
SELECT * FROM @sklad

//требуется показать не все древо, а только те ветви, на которые есть 
//ссылающиеся запись, в моем случае надо отобразить только эти ветви :
//Корень > Фрукты > Бананы
//Корень > Фрукты > Киви
15 апр 16, 09:26    [19059932]     Ответить | Цитировать Сообщить модератору
 Re: Отфильтровать ветви древа  [new]
f50
Member

Откуда: Россия
Сообщений: 453
Вернее, если было бы 2 уровня ветвей, проблем бы не было, отобрал бы корневую + там где есть товар, но в нормальном дереве может быть сколько угодно уровней вервей, сложность в том что может быть скажем... 7 уровней ветвей (пустых, но определяющих структуру ветвления), а на 8м уровне есть товар. Надо все 8 уровней "вытащить" для выборки...
15 апр 16, 09:29    [19059951]     Ответить | Цитировать Сообщить модератору
 Re: Отфильтровать ветви древа  [new]
f50
Member

Откуда: Россия
Сообщений: 453
Жаль редактировать не могу, прощу прощения, в свитке примечания не правильно написал, и результат уточнил какой бы требовалось..

+

DECLARE @tovar TABLE (id int, parentid int, v nvarchar(15))
INSERT INTO @tovar VALUES (1, 0, 'Корень')
INSERT INTO @tovar VALUES (2, 1, 'Фрукты')
INSERT INTO @tovar VALUES (3, 1, 'Овощи')
INSERT INTO @tovar VALUES (4, 1, 'Конфеты')
INSERT INTO @tovar VALUES (5, 3, 'Картофель')
INSERT INTO @tovar VALUES (6, 3, 'Морковь')
INSERT INTO @tovar VALUES (7, 3, 'Капуста')
INSERT INTO @tovar VALUES (8, 4, 'Шоколадные')
INSERT INTO @tovar VALUES (9, 4, 'Карамель')
INSERT INTO @tovar VALUES (10, 2, 'Яблоки')
INSERT INTO @tovar VALUES (11, 2, 'Груша')
INSERT INTO @tovar VALUES (12, 2, 'Мандарины')
INSERT INTO @tovar VALUES (13, 2, 'Апельсины')
INSERT INTO @tovar VALUES (14, 2, 'Бананы')
INSERT INTO @tovar VALUES (15, 2, 'Киви')

--2. Есть таблица с количеством товара

DECLARE @sklad TABLE (idtovar int, kolvo int)
INSERT INTO @sklad VALUES (14, 1500)
INSERT INTO @sklad VALUES (15, 2500)

--3. Вывод данных

SELECT * FROM @tovar ORDER BY parentid, v
SELECT * FROM @sklad

--требуется показать не все древо, а только те ветви, на которые есть 
--ссылающиеся запись, в моем случае надо отобразить только эти ветви :
--Корень > Фрукты > Бананы
--Корень > Фрукты > Киви

--как в таблице:


idparentidv
10Корень
21Фрукты
142Бананы
152Киви


15 апр 16, 09:34    [19059977]     Ответить | Цитировать Сообщить модератору
 Re: Отфильтровать ветви древа  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
f50,

выберите те которые есть, а потом через рекурсивный cte докидайте дерево выше
15 апр 16, 09:38    [19060009]     Ответить | Цитировать Сообщить модератору
 Re: Отфильтровать ветви древа  [new]
f50
Member

Откуда: Россия
Сообщений: 453
TaPaK,
мысль нужная, у меня проблема с реализацией, буду пробовать!
15 апр 16, 09:52    [19060087]     Ответить | Цитировать Сообщить модератору
 Re: Отфильтровать ветви древа  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
f50,

реализация чисто по хелпу... допиливайте :)
;WITH xx
AS
(
	SELECT * 
	FROM @tovar x 
	WHERE 
		EXISTS 
		(
			SELECT 1
			FROM @sklad
			WHERE 
				idtovar = x.Id 
		)
	UNION ALL
	SELECT 
		a.*
	FROM	@tovar	a
	JOIN	xx	b
	ON
		a.Id = b.parentid	
)
SELECT 
DISTINCT *
FROM xx
ORDER BY ParentId
15 апр 16, 09:54    [19060102]     Ответить | Цитировать Сообщить модератору
 Re: Отфильтровать ветви древа  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
f50,
у вас в дереве и товары и типы и группы, имхо добавить признак, чтобы не проверять всё подряд.
15 апр 16, 10:02    [19060155]     Ответить | Цитировать Сообщить модератору
 Re: Отфильтровать ветви древа  [new]
f50
Member

Откуда: Россия
Сообщений: 453
TaPaK, хороший человек, огромное спасибо, так и надо!!!
Дедушка, да вроде дерево как дерево, ничего лишнего, а количество в соседней таблице...
15 апр 16, 10:13    [19060233]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить