У меня есть таблица для активов:
id|name|parentId
Я пытаюсь построить представление для актива:
{
'Id': ......,
'Name': ....,
'ChildrenIds': []
}
Мне нужен запрос, который выбирает ТОП-50 активов и их прямых потомков (таким образом, результатом может быть более 50 результатов).
У меня есть CTE, который работает, но он медленный (5 секунд, parentId & id проиндексирован):
WITH MyCte as
(
SELECT TOP 50 a.Id, a.Name, a.ParentAssetId
FROM assets a
UNION ALL
SELECT a2.AssetId, a2.ParentAssetId
FROM assets a2
INNER JOIN MyCte cte ON cte.Id = a2.ParentAssetId
)
SELECT * From MyCte;
Этот запрос на соединение выполняет половину того, что я хочу.
SELECT TOP 50 a.Id, a.Name, a.ParentAssetId
FROM assets a
LEFT JOIN assets a2 ON a2.ParentAssetId = a.Id
Проблема с JOIN, она дает мне 50 результатов, и все. Мне нужна информация о потомке, чтобы построить представление. Я мог бы сделать 2 запроса, но я бы предпочел не делать этого.
Есть предложения?
Может быть, есть лучший способ для меня построить это представление? Без требования 50 + N? Вы можете использовать GROUP BY с STRING_AGG, но я беспокоюсь об ограничении размера.
SAMPLE DATA:
1,Site1,NULL
2,Site2,1
3,Site3,1
4,Site4,2
5,Site5,NULL
Результаты TOP 3 ORDER BY id DESC вернутся
1,Site1,NULL
2,Site2,1
3,Site3,1
4,Site4,2
НО я думаю, в идеале что-то вроде этого:
1,Site1,NULL|2,Site2,1|3,Site3,1
2,Site2,1|4,Site4,2
3,Site3,1