Вы можете попробовать использовать cte для получения набора результатов, который содержит ваши ожидаемые значения parent_id
и child_id
, затем используйте FOR XML PATH
, объедините их с &
.
наконец, используйте row_number
оконную функцию, создайте номер строки с помощью CASE WHEN
, выполните функцию агрегирования, разрешите отображение только первой строки child_id
.
;with cte as (
SELECT t1.*
FROM T t1
where
EXISTS (SELECT 1 FROM T tt WHERE t1.child_id = tt.child_id AND t1.parent_id <> tt.parent_id)
AND
t1.parent_id in (1,2) --add you want to get parent_id id
), cte1 as (
SELECT
distinct parent_id,
STUFF((
select '&' + CAST(tt.child_id AS VARCHAR(MAX))
from cte tt
where t1.parent_id = tt.parent_id
FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)')
,1,1,'') AS child_id
FROM cte t1
)
SELECT parent_id,(case when rn = 1 then child_id else '' end) child_id
FROM (
select *,row_number() over(order by parent_id) rn
from cte1
) t1
Sqlfiddle
Результат
parent_id child_id
1 12&13
2