我将Oracle查询转换为SQL Server 2008版本时遇到问题。在此Oracle查询中使用了LISTAGG
和connect by prior
。我研究了网络,发现SQL Server 2008中WITH AS ()
是connect by prior
等效的。
对于SQL Server 2008中的LISTAGG
备用,我们也可以使用STUFF()
。但是我很难将这两种逻辑合二为一。请帮我。我试过的解决方案似乎是错的。
这是Oracle查询:
SELECT
(LISTAGG(T1.c2, '/') WITHIN GROUP (ORDER BY T1.c1))
FROM
Table1 T1
START WITH T1.c1 = T2.c3
CONNECT BY PRIOR T1.c3 = T1.c1
这是我尝试的解决方案:
with n(col1, col2) as
(
select T1.c1, '/' + T1.c2
from table1 T1,
where T1.c1 = T2.c3
union ALL
select T3.c1, '/' + T3.c2
from table1 as T4,T3
where T4.c3 = T3.c1
)
select col2 from n;
这两个查询中T2
都是外部查询中使用的Table2
的引用。
例如:
Select
.....,
.....,
.
.
(
select (LISTAGG(T1.c2, '/') WITHIN GROUP (ORDER BY T1.c1))
FROM Table1 T1
start with T1.c1 = T2.c3
connect by prior T1.c3 = T1.c1
) as ABC,
'
'
'
From
Table A,
Table B,
.
.
Table T2
我引用的链接::
答案 0 :(得分:0)
LISTAGG
您可以here。
With
你可以在SQL中这样做:
select * into #n from
(
select T1.c1 col1, '/' + T1.c2 col2
from table1 T1,
where T1.c1 = T2.c3
union ALL
select T3.c1, '/' + T3.c2
from table1 as T4,T3
where T4.c3 = T3.c1
)