powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Listagg в connect by prior
11 сообщений из 11, страница 1 из 1
Listagg в connect by prior
    #39740353
Фотография Frequency
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите пожалуйста найти аналог иерархическому аналогу (connect by prior ) в MS SQL плюс чтобы они выводились все в одной строке (Listagg ) я сам пишу на oracle нужен аналог на MS SQL.

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

Спасибо
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39740356
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frequency,

все должны знать, что это такое? Лень написать об этом пару фраз?
Или даже не так. Ждёте ответа только от тех, кто знает и Oracle и MSSQL?
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39740357
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frequency,

wtf CONNECT BY PRIOR внутри LISTAGG?
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39740359
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frequency,

STRING_AGG я так понимаю...
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39740365
WarAnt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frequency,

geography::STGeomFromText('LINESTRING(-122.360 47.656, -122.343 47.656 )', 4326));
пойдет?
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39740375
Eleanor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frequencyнайти аналог иерархическому аналогу (connect by prior ) в MS SQL
В Оракле у вас есть аналог connect by в виде CTE .
В SQl Server работает ровно такой же синтаксис с CTE.
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39740380
Фотография Frequency
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TaPaKFrequency,

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



Забыл уточнить версию базы мне нужно на 2014
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39740384
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FrequencyЗабыл уточнить версию базы мне нужно на 2014for xml path
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39746520
Фотография Frequency
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--------------------------MS SQL-------------------------

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
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-----------------------------

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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жалуйста
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39746536
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Frequency------------Result
EMP_NAME | LEVELS
----------------------------------------------------
NAME_4 | LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
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'



Код: sql
1.
2.
3.
ID          NAME                                                  EMP_NAME
----------- ------------------------------------------------------------------------
8           LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6             NAME_4
...
Рейтинг: 0 / 0
Listagg в connect by prior
    #39746553
Фотография Frequency
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
courtFrequency------------Result
EMP_NAME | LEVELS
----------------------------------------------------
NAME_4 | LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
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'



Код: sql
1.
2.
3.
ID          NAME                                                  EMP_NAME
----------- ------------------------------------------------------------------------
8           LEVEL1,LEVEL2,LEVEL3,LEVEL4,LEVEL5,LEVEL6             NAME_4



Спасибо большое , очень помогли
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Listagg в connect by prior
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]