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

Откуда: Москва
Сообщений: 606
SELECT @@VERSION

Microsoft SQL Server 2017 (RTM-CU23) (KB5000685) - 14.0.3381.3 (X64)   Feb  9 2021 12:08:50   
Copyright (C) 2017 Microsoft Corporation  Enterprise Edition (64-bit) on Windows Server 2016 Standard 10.0 <X64> (Build 14393: ) 


Есть таблица иерархии и справочник продуктов

+
DECLARE @hier TABLE (id INT,par_id INT,code NVARCHAR(10))
INSERT INTO @hier
(
    id,
    par_id,
    code
)

SELECT 1,11,'MAIN'
UNION
SELECT 11,21,'MAIN'
UNION
SELECT 21,31,'MAIN'
UNION
SELECT 31,41,'MAIN'
UNION
SELECT 41,NULL,'MAIN'
union
SELECT 2,22,'MAIN'
UNION
SELECT 22,32,'MAIN'
UNION
SELECT 32,NULL,'MAIN'
UNION
SELECT 5,15,'MAIN'
UNION
SELECT 15,31,'MAIN'

DECLARE @product TABLE(id INT,lname VARCHAR(50))
INSERT INTO @product
(
    id,
    lname
)

SELECT 1,'продукт1'
UNION
SELECT 11,'продукт11'
UNION
SELECT 21,'продукт21'
UNION
SELECT 31,'продукт31'
UNION
SELECT 41,'продукт41'
UNION
SELECT 2,'продукт2'
union
SELECT 22,'продукт22'
UNION
SELECT 32,'продукт32'
UNION
SELECT 5,'продукт5'
UNION
SELECT 15,'продукт15'


всего может быть максимум 5 уровней иерархии, нужно их выстроить в строку таким образом. Чтобы каждый продукт имел свою линейную иерархию.


id product_lev1_idproduct_lev1_nameproduct_lev2_idproduct_lev2_nameproduct_lev3_idproduct_lev3_nameproduct_lev4_idproduct_lev4_nameproduct_lev5_idproduct_lev5_name
1 41 продукт41 31 продукт31 21 продукт21 11 продукт11 1 продукт1
2 32 продукт32 22 продукт22 2 продукт2 2 продукт2 2 продукт2
5 41 продукт41 31 продукт31 15 продукт15 5 продукт5 5 продукт5
11 41 продукт41 31 продукт31 21 продукт21 11 продукт1111 продукт11
21 41 продукт41 31 продукт31 21 продукт2121 продукт2121 продукт21
31 41 продукт41 31 продукт31 31 продукт3131 продукт3131 продукт31
4141 продукт4141 продукт4141 продукт4141 продукт4141 продукт41
2232 продукт32 22 продукт2222 продукт2222 продукт2222 продукт22
3232 продукт3232 продукт3232 продукт3232 продукт3232 продукт32
1541 продукт41 31 продукт31 15 продукт1515 продукт1515 продукт15


Написал запрос, помогите его докрутить:
+
DECLARE @hier TABLE (id INT,par_id INT,code NVARCHAR(10))
INSERT INTO @hier
(
    id,
    par_id,
    code
)

SELECT 1,11,'MAIN'
UNION
SELECT 11,21,'MAIN'
UNION
SELECT 21,31,'MAIN'
UNION
SELECT 31,41,'MAIN'
UNION
SELECT 41,NULL,'MAIN'
union
SELECT 2,22,'MAIN'
UNION
SELECT 22,32,'MAIN'
UNION
SELECT 32,NULL,'MAIN'
UNION
SELECT 5,15,'MAIN'
UNION
SELECT 15,31,'MAIN'

DECLARE @product TABLE(id INT,lname VARCHAR(50))
INSERT INTO @product
(
    id,
    lname
)

SELECT 1,'продукт1'
UNION
SELECT 11,'продукт11'
UNION
SELECT 21,'продукт21'
UNION
SELECT 31,'продукт31'
UNION
SELECT 41,'продукт41'
UNION
SELECT 2,'продукт2'
union
SELECT 22,'продукт22'
UNION
SELECT 32,'продукт32'
UNION
SELECT 5,'продукт5'
UNION
SELECT 15,'продукт15'



;WITH hier AS 
(
SELECT h.id,h.par_id,p.lname,h.code
FROM @hier h
LEFT JOIN @product p ON p.id=h.id
WHERE h.code='MAIN'
)

SELECT COALESCE(e.id,d.id,c.id,b.id,a.id) id
,a.id product_lev1_id, a.lname  product_lev1_name
,COALESCE(b.id,a.id) product_lev2_id,COALESCE(b.lname,a.lname) product_lev2_name
,COALESCE(c.id,b.id,a.id) product_lev3_id,COALESCE(c.lname,b.lname,a.lname) product_lev3_name
,COALESCE(d.id,c.id,b.id,a.id) product_lev4_id,COALESCE(d.lname,c.lname,b.lname,a.lname) product_lev4_name
,COALESCE(e.id,d.id,c.id,b.id,a.id) product_lev5_id,COALESCE(e.lname,d.lname,c.lname,b.lname,a.lname) product_lev5_name
FROM hier a
LEFT JOIN hier b ON a.id=b.par_id
LEFT JOIN hier c ON b.id=c.par_id
LEFT JOIN hier d ON c.id=d.par_id
LEFT JOIN hier e ON d.id=e.par_id
WHERE a.par_id IS NULL


Сообщение было отредактировано: 28 апр 21, 12:15
28 апр 21, 12:20    [22315552]     Ответить | Цитировать Сообщить модератору
 Re: выстроить иерархию продуктов в строку  [new]
aleks222
Member

Откуда:
Сообщений: 1355
Осподи, бред то какой.

1. Строите свою "иерархию" в "колоночку".
2. Колбасите PIVOT.
28 апр 21, 15:16    [22315693]     Ответить | Цитировать Сообщить модератору
 Re: выстроить иерархию продуктов в строку  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4833
aleks222,

Вот здесь есть пример рекурсивного запроса с выстраиванием цепочки

https://www.sql.ru/forum/1322566/rekursiya-s-dublyami
28 апр 21, 16:43    [22315758]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить