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

Откуда:
Сообщений: 212
Помогите пожалуйста найти аналог иерархическому аналогу (connect by prior ) в MS SQL плюс чтобы они выводились все в одной строке (Listagg ) я сам пишу на oracle нужен аналог на MS SQL.

Грубо говоря CONNECT BY PRIOR внутри LISTAGG

Спасибо
29 ноя 18, 13:48    [21748539]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
iap
Member

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

все должны знать, что это такое? Лень написать об этом пару фраз?
Или даже не так. Ждёте ответа только от тех, кто знает и Oracle и MSSQL?
29 ноя 18, 13:52    [21748545]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7760
Frequency,

wtf CONNECT BY PRIOR внутри LISTAGG?
29 ноя 18, 13:53    [21748546]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
TaPaK
Member

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

STRING_AGG я так понимаю...
29 ноя 18, 13:54    [21748552]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
WarAnt
Member

Откуда: Питер
Сообщений: 2421
Frequency,

geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326));
пойдет?
29 ноя 18, 14:08    [21748575]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
Eleanor
Member

Откуда:
Сообщений: 2867
Frequency
найти аналог иерархическому аналогу (connect by prior ) в MS SQL

В Оракле у вас есть аналог connect by в виде CTE.
В SQl Server работает ровно такой же синтаксис с CTE.
29 ноя 18, 14:26    [21748614]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
Frequency
Member

Откуда:
Сообщений: 212
TaPaK
Frequency,

STRING_AGG я так понимаю...




Забыл уточнить версию базы мне нужно на 2014
29 ноя 18, 14:35    [21748628]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
invm
Member

Откуда: Москва
Сообщений: 9348
Frequency
Забыл уточнить версию базы мне нужно на 2014
for xml path
29 ноя 18, 14:42    [21748640]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
Frequency
Member

Откуда:
Сообщений: 212
--------------------------MS SQL-------------------------

DROP TABLE #TEMP;

CREATE TABLE #TEMP (ID INT , PARENT_ID INT , NAME NVARCHAR(500) , EMP_NAME NVARCHAR(500));

INSERT INTO #TEMP VALUES (1 , NULL	, 'LEVEL1' , 'NAME_1' );
INSERT INTO #TEMP VALUES (2 , 1		, 'LEVEL2' , 'NAME_2' );
INSERT INTO #TEMP VALUES (3 , 2		, 'LEVEL3' , 'NAME_2' );
INSERT INTO #TEMP VALUES (4 , 3		, 'LEVEL4' , 'NAME_2' );
INSERT INTO #TEMP VALUES (5 , 4		, 'LEVEL5' , 'NAME_3' );
INSERT INTO #TEMP VALUES (6 , 4		, 'LEVEL5' , 'NAME_3' );
INSERT INTO #TEMP VALUES (7 , 4		, 'LEVEL5' , 'NAME_3' );
INSERT INTO #TEMP VALUES (8 , 5		, 'LEVEL6' , 'NAME_4' );



WITH MAIN(ID , NAME , EMP_NAME) AS 
(
SELECT  T1.ID  , T1.NAME , T1.EMP_NAME  FROM #TEMP T1  
UNION ALL
SELECT  T2.ID  , T2.NAME , T2.EMP_NAME FROM #TEMP T2 , MAIN M
WHERE M.ID = T2.PARENT_ID 
)

SELECT  EMP_NAME , STRING_AGG(NAME , CHAR(44)) LEVELS FROM MAIN WHERE EMP_NAME = 'NAME_4' GROUP BY EMP_NAME;


------------Result
EMP_NAME | LEVELS
----------------------------------------------------
NAME_4 | LEVEL6,LEVEL6,LEVEL6,LEVEL6,LEVEL6,LEVEL6

-------------------------Oracle-----------------------------

DROP TABLE TEMP;

CREATE TABLE TEMP (ID INT , PARENT_ID INT , LEVELS VARCHAR2(500) , EMP_NAME VARCHAR2(500));

BEGIN
INSERT INTO TEMP VALUES (1 , NULL    , 'LEVEL1' , 'NAME_1' );
INSERT INTO TEMP VALUES (2 , 1        , 'LEVEL2' , 'NAME_2' );
INSERT INTO TEMP VALUES (3 , 2        , 'LEVEL3' , 'NAME_2' );
INSERT INTO TEMP VALUES (4 , 3        , 'LEVEL4' , 'NAME_2' );
INSERT INTO TEMP VALUES (5 , 4        , 'LEVEL5' , 'NAME_3' );
INSERT INTO TEMP VALUES (6 , 4        , 'LEVEL5' , 'NAME_3' );
INSERT INTO TEMP VALUES (7 , 4        , 'LEVEL5' , 'NAME_3' );
INSERT INTO TEMP VALUES (8 , 5        , 'LEVEL6' , 'NAME_4' );
END;

-----------

    SELECT EMP_NAME,
          (SELECT LISTAGG (T.LEVELS, ',') WITHIN GROUP (ORDER BY T.LEVELS)  
           FROM TEMP T 
           START WITH T.ID = T1.ID  
           CONNECT BY T.ID = PRIOR T.PARENT_ID
           )  AS LEVELS    
     FROM TEMP T1 
 WHERE EMP_NAME = 'NAME_4';

------------Result
EMP_NAME | LEVELS
----------------------------------------------------
NAME_4 | LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6

---------------------------------------------------------------------------------

Помогите пoжалуйста
12 дек 18, 11:17    [21761180]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
court
Member

Откуда:
Сообщений: 2016
Frequency
------------Result
EMP_NAME | LEVELS
----------------------------------------------------
NAME_4 | LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6

---------------------------------------------------------------------------------


WITH MAIN(ID , NAME , EMP_NAME) AS 
(
SELECT  T1.ID  , cast(T1.NAME as varchar(max)) as NAME, T1.EMP_NAME  FROM #TEMP T1  where T1.PARENT_ID is null 
UNION ALL
SELECT  T2.ID  , cast(M.Name+','+T2.NAME as varchar(max)) , T2.EMP_NAME FROM #TEMP T2 inner join MAIN M on M.ID = T2.PARENT_ID 
)
select * from MAIN WHERE EMP_NAME = 'NAME_4'


ID          NAME                                                  EMP_NAME
----------- ------------------------------------------------------------------------
8           LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6             NAME_4
12 дек 18, 11:35    [21761206]     Ответить | Цитировать Сообщить модератору
 Re: Listagg в connect by prior  [new]
Frequency
Member

Откуда:
Сообщений: 212
court
Frequency
------------Result
EMP_NAME | LEVELS
----------------------------------------------------
NAME_4 | LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6

---------------------------------------------------------------------------------


WITH MAIN(ID , NAME , EMP_NAME) AS 
(
SELECT  T1.ID  , cast(T1.NAME as varchar(max)) as NAME, T1.EMP_NAME  FROM #TEMP T1  where T1.PARENT_ID is null 
UNION ALL
SELECT  T2.ID  , cast(M.Name+','+T2.NAME as varchar(max)) , T2.EMP_NAME FROM #TEMP T2 inner join MAIN M on M.ID = T2.PARENT_ID 
)
select * from MAIN WHERE EMP_NAME = 'NAME_4'


ID          NAME                                                  EMP_NAME
----------- ------------------------------------------------------------------------
8           LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6             NAME_4


Спасибо большое , очень помогли
12 дек 18, 11:50    [21761242]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить